/**
* Assuming that your model contains a certain method, this allows
* you to create a frame which will pop you a new frame with
* a form representing model method arguments. Once the form
* is submitted, the action will be evaluated.
*
* @param string $method_name
* @param array $options
*/
public function addAction($method_name, $options = array())
{
if (!$this->model) {
throw $this->exception('Must set CRUD model first');
}
if ($options == 'toolbar') {
$options = array('column' => false);
}
if ($options == 'column') {
$options = array('toolbar' => false);
}
$descr = $options['descr'] ?: ucwords(str_replace('_', ' ', $method_name));
$icon = $options['icon'] ?: 'target';
$show_toolbar = isset($options['toolbar']) ? $options['toolbar'] : true;
$show_column = isset($options['column']) ? $options['column'] : true;
if ($this->isEditing($method_name)) {
/** @type View_Console $c */
$c = $this->virtual_page->getPage()->add('View_Console');
$self = $this;
// Callback for the function
$c->set(function ($c) use($show_toolbar, $show_column, $options, $self, $method_name) {
if ($show_toolbar && !$self->id) {
$self->model->unload();
} elseif ($show_column && $self->id) {
$c->out('Loading record ' . $self->id, array('class' => 'atk-effect-info'));
$self->model->load($self->id);
} else {
return;
}
$ret = $self->model->{$method_name}();
$c->out('Returned: ' . json_encode($ret, JSON_UNESCAPED_UNICODE), array('class' => 'atk-effect-success'));
/*
if (isset($options['args'])) {
$params = $options['args'];
} elseif (!method_exists($self->model, $method_name)) {
// probably a dynamic method
$params = array();
} else {
$reflection = new ReflectionMethod($self->model, $method_name);
$params = $reflection->getParameters();
}
*/
});
return;
/* unused code below
$has_parameters = (bool) $params;
foreach ($params as $i => $param) {
$this->form->addField($param->name);
$this->has_parameters = true;
}
if (!$has_parameters) {
$this->form->destroy();
$ret = $this->model->$method_name();
if (is_object($ret) && $ret == $this->model) {
$this->virtual_page->getPage()->add('P')->set('Executed successfully');
$this->virtual_page->getPage()->js(true, $this->js_reload);
} else {
$this->virtual_page->getPage()->js(true, $this->js_reload);
if (is_object($ret)) {
$ret = (string) $ret;
}
$this->virtual_page->getPage()
->add('P')->set('Returned: '.json_encode($ret, JSON_UNESCAPED_UNICODE));
}
$this->virtual_page->getPage()
->add('Button')->set(array('Close', 'icon' => 'cross', 'swatch' => 'green'))
->js('click')->univ()->closeDialog();
return true;
}
$this->form->addSubmit('Execute');
if ($this->form->isSubmitted()) {
$ret = call_user_func_array(array($this->model, $method_name), array_values($this->form->get()));
if (is_object($ret)) {
$ret = (string) $ret;
}
$this->js(null, $this->js()->reload())->univ()
->successMessage('Returned: '.json_encode($ret, JSON_UNESCAPED_UNICODE))
->closeDialog()
->execute();
}
return true;
*/
} elseif ($this->isEditing()) {
return;
}
$frame_options = array_merge(array(), $this->frame_options ?: array());
if ($show_column) {
$this->virtual_page->addColumn($method_name, $descr . ' ' . $this->entity_name, array('descr' => $descr, 'icon' => $icon), $this->grid);
}
if ($show_toolbar) {
$button = $this->addButton(array($descr, 'icon' => $icon));
// Configure Add Button on Grid and JS
$button->js('click')->univ()->frameURL($this->app->_($this->entity_name . '::' . $descr), $this->virtual_page->getURL($method_name), $frame_options);
}
}