v7‰PNG
IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ±üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0AºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT
form */
protected $formValueCallbacks = array(
self::GET => array(),
self::SET => array(),
);
protected $recordTitle;
public function renderTitle($noTags = false)
{
if ($this->getRequest()->getActionName() == 'index')
return parent::renderTitle($noTags);
$action = $this->actionGet($this->getCurrentAction());
if (!$action) return parent::renderTitle($noTags);
$title = $this->getRecordTitle($action->getTitle());
if (!$noTags)
$title .= sprintf(' (%s)',
$this->escape($this->getBackUrl()),
___("return")
);
return $title;
}
public function __construct($id, $title, Am_Grid_DataSource_Interface_Editable $ds,
Am_Mvc_Request $request, Am_View $view, Am_Di $di = null)
{
parent::__construct($id, $title, $ds, $request, $view, $di);
$this->recordTitle = ___("Record");
$this->initActions();
}
public function initActions()
{
// override to add default actions
$this->actionAdd(new Am_Grid_Action_Edit);
$this->actionAdd(new Am_Grid_Action_Delete);
$this->actionAdd(new Am_Grid_Action_Insert);
//$this->actionAdd(new Am_Grid_Action_Group_Delete);
}
/**
* Add action to be executed on the grid
*/
public function actionAdd(Am_Grid_Action_Abstract $action)
{
$this->actions[ $action->getId() ] = $action;
$action->setGrid($this);
return $action;
}
/** @return Am_Grid_Action_Abstract */
public function actionGet($id)
{
if ($id == 'index') return null;
return $this->actions [ $id ];
}
public function getActions($type = null)
{
if ($type !== null)
{
$ret = array();
foreach ($this->actions as $action)
if ($action->getType() == $type)
$ret[] = $action;
} else {
$ret = $this->actions;
}
foreach ($ret as $k => $action)
if (!$action->hasPermissions())
unset($ret[$k]);
return $ret;
}
public function actionsClear()
{
$this->actions = array();
return $this;
}
public function actionDelete($id)
{
foreach ($this->actions as $k => $action)
if ($action->getId() == $id)
unset($this->actions[$k]);
return $this;
}
/**
* Add action fields if necessary
* @staticvar int $fieldActionsAdded
* @return type
*/
public function getFields()
{
static $fieldActionsAdded = 0;
if (!$fieldActionsAdded++)
{
if ($this->getActions(Am_Grid_Action_Abstract::SINGLE))
$this->addField(new Am_Grid_Field_Actions('_actions'));
if ($this->getActions(Am_Grid_Action_Abstract::GROUP))
$this->prependField(new Am_Grid_Field_Checkboxes('_checkboxes', 'Checkboxes'));
$fieldActionsAdded = 1;
}
return $this->fields;
}
/**
* @return Am_Form
*/
public function getForm()
{
if ($this->form === null)
{
$this->form = $this->createForm();
$args = array($this->form);
$this->runCallback(self::CB_INIT_FORM, $args);
$this->initForm();
}
return $this->form;
}
/**
* Prepare form to be used in the grid
*/
public function initForm()
{
$this->form->setDataSources(array(
$this->getCompleteRequest(),
));
$vars = array();
foreach ($this->getVariablesList() as $k) {
$vars[$this->getId() .'_'. $k] = $this->request->get($k, "");
}
foreach (Am_Html::getArrayOfInputHiddens($vars) as $name => $value) {
$this->form->addHidden($name)->setValue($value);
}
$this->form->addSaveButton(___("Save"));
}
/**
* Set className of forms, or clean form object
* @param string|Am_Form $formClass
* @return Am_Grid_Editable
*/
public function setForm($formClass)
{
$this->formClass = $formClass;
return $this;
}
/**
* Set a function to be executed to get and set value
* record->form, form->record
*/
public function setFormValueCallback($field, $getCallback, $setCallback, $getArgs=array(), $setArgs=array())
{
if ($getCallback !== null)
$this->formValueCallbacks[self::GET][$field] = array($getCallback, $getArgs);
else
unset($this->formValueCallbacks[self::GET][$field]);
///
if ($setCallback !== null)
$this->formValueCallbacks[self::SET][$field] = array($setCallback, $setArgs);
else
unset($this->formValueCallbacks[self::SET][$field]);
return $this;
}
/**
* You must either set @link $formClass or override this method in subclass
* @return Am_Form
*/
public function createForm()
{
if (!$this->formClass)
throw new Am_Exception_InternalError("No [formClass] set in " . __METHOD__);
if ($this->formClass instanceof Am_Form) {
$ret = $this->formClass;
} elseif (is_string($this->formClass)) {
$class = $this->formClass;
$ret = new $class;
} elseif (is_callable($this->formClass)) {
$ret = call_user_func($this->formClass, $this);
}
return $ret;
}
public function actionRun($actionName)
{
$args = array($this);
$this->runCallback(self::CB_INIT_GRID, $args);
if ($actionName == 'index')
return $this->indexAction();
if (!array_key_exists($actionName, $this->actions))
throw new Am_Exception_InputError("Wrong action called : [$actionName] in " .get_class($this));
$action = $this->actions[$actionName];
try {
$action->checkPermissions();
$action->run($this);
} catch (Am_Exception_InputError $e) {
echo $this->renderException($e, $actionName);
}
}
protected function renderException($e, $actionName)
{
$out = '
Error happened during [$customAction] operation: ';
$out .= $this->escape($e->getMessage());
$out .= '
' . PHP_EOL;
$out .= sprintf('%s'.PHP_EOL,
$this->escape($this->getBackUrl()),
___("Continue"));
return $out;
}
/**
* @param string|callback $recordTitle
*/
public function setRecordTitle($recordTitle)
{
$this->recordTitle = $recordTitle;
}
public function getRecordTitle($actionName = null)
{
if ($actionName !== null)
return sprintf($actionName, $this->_getRecordTitle());
else
return $this->_getRecordTitle();
}
protected function _getRecordTitle()
{
return is_callable($this->recordTitle)
? call_user_func($this->recordTitle, $this->getRecordId(false) ? $this->getRecord() : null)
: $this->recordTitle;
}
public function renderTable()
{
return $this->renderButtons() .
parent::renderTable() .
$this->renderGroupActions();
}
/**
* Return url for action
* @param Am_Grid_Action_Abstract|string $action
* @param int $id
* @return type
*/
public function getActionUrl($action, $id = null)
{
if (is_string($action))
$action = $this->actionGet($action);
$params = array(
Am_Grid_ReadOnly::ACTION_KEY => $action->getId(),
Am_Grid_ReadOnly::BACK_KEY => $this->makeUrl(),
);
if ($id && ($action->getType() == Am_Grid_Action_Abstract::SINGLE))
$params[Am_Grid_ReadOnly::ID_KEY] = $id;
$url = $this->makeUrl($params);
return $url;
}
public function renderButtons()
{
$actions = $this->getActions(Am_Grid_Action_Abstract::NORECORD);
if (!$actions) return;
$out = '' . PHP_EOL;
foreach ($actions as $action)
{
$out .= sprintf('
%s' . PHP_EOL,
$action->getCssClass(),
$this->getCssClass() . '-' . $action->getId() . '-button',
$this->escape($action->getUrl()),
!is_null($action->getTarget()) ? sprintf('target="%s" ', $action->getTarget()) : '',
$this->escape($this->getRecordTitle($action->getTitle()))
);
}
$out .= "
" . PHP_EOL;
return $out;
}
public function renderGroupActions()
{
$actions = $this->getActions(Am_Grid_Action_Abstract::GROUP);
if (!$actions) return;
$out = '' . PHP_EOL;
$out .= '" . PHP_EOL;
$out .= '
' . PHP_EOL;
return $out;
}
public function getVariablesList()
{
return array_merge(parent::getVariablesList(), array(self::ID_KEY, self::BACK_KEY));
}
public function getBackUrl()
{
$url = $this->getRequest()->get('b');
if (!$url) $url = $this->makeUrl(null);
return $url;
}
public function redirect($url)
{
$this->response->headersSentThrowsException = false;
$this->response->setRedirect($url);
}
/**
* return back to grid using headers or special redirect text based on request contents
*/
public function redirectBack()
{
$this->redirect($this->getBackUrl());
}
public function _transformFormValues($direction, & $arr)
{
foreach ($this->formValueCallbacks[$direction] as $field => $cbarr)
{
list($cb, $args) = $cbarr;
array_unshift($args, !isset($arr[$field]) ? null : $arr[$field]);
if (is_array($cb) && ($cb[0]===self::RECORD))
$cb[0]=$this->getRecord();
$arr[$field] = call_user_func_array($cb, $args);
}
}
public function valuesToForm()
{
$record = $this->getRecord();
$ret = method_exists($record, 'toArray') ? $record->toArray() : (array)$record;
$this->_transformFormValues(self::GET, $ret);
$args = array(& $ret, $record);
$this->runCallback(self::CB_VALUES_TO_FORM, $args);
return $ret;
}
public function valuesFromForm()
{
$values = $this->getForm()->getValue();
foreach ($this->getVariablesList() as $k)
{
unset($values[$this->getId() . '_' . $k]);
}
unset($values['save']);
unset($values['_save_']);
$this->_transformFormValues(self::SET, $values);
$args = array(& $values, $this->getRecord());
$this->runCallback(self::CB_VALUES_FROM_FORM, $args);
return $values;
}
/** @return Am_Record */
function getRecord($action = null)
{
if ($action === null)
$action = preg_match('|^insert|', $this->request->getActionName()) ? self::ACTION_INSERT : self::ACTION_EDIT;
if ($this->record === null)
if ($action == self::ACTION_INSERT)
{
$this->record = $this->getDataSource()->createRecord();
} else {
$this->record = $this->getDataSource()->getRecord($this->getRecordId());
}
return $this->record;
}
function getRecordId($throwException = true)
{
$id = $this->getRequest()->getFiltered(self::ID_KEY, null);
if (!$id && $throwException) throw new Am_Exception_InputError("Wrong link - empty id in " . __METHOD__);
return $id;
}
function validate()
{
return $this->getForm()->validate();
}
/**
* Do all necessary actions to validate and save form value
* @param type $action
* @return bool true if saved
*/
function doFormActions($action)
{
$form = $this->getForm();
if ($form->isSubmitted() && $this->validate())
{
$record = $this->getRecord($action);
$values = $this->valuesFromForm();
$args = array(& $values, $record, $this);
if ($action == self::ACTION_INSERT)
{
$this->runCallback(self::CB_BEFORE_INSERT, $args);
$this->runCallback(self::CB_BEFORE_SAVE, $args);
$this->getDataSource()->insertRecord($record, $values);
$this->runCallback(self::CB_AFTER_INSERT, $args);
$this->runCallback(self::CB_AFTER_SAVE, $args);
} else {
$this->runCallback(self::CB_BEFORE_UPDATE, $args);
$this->runCallback(self::CB_BEFORE_SAVE, $args);
$this->getDataSource()->updateRecord($this->getRecord($action), $values);
$this->runCallback(self::CB_AFTER_UPDATE, $args);
$this->runCallback(self::CB_AFTER_SAVE, $args);
}
return true;
} elseif (!$form->isSubmitted()) {
$form->setDataSources(array(
new HTML_QuickForm2_DataSource_Array($this->valuesToForm(),
$this->getCompleteRequest())
));
}
return false;
}
}