onAjaxUrl instanceof Closure) { return ($this->onAjaxUrl)($action); } return $this->controller->adminLink( 'extensions&name=' . $this->controller->getName() . '&type=' . $this->controller->getExtensionType() . '&form_id=' . $this->id . '&act=settings.form.ajax', 'dev' ) . '&' . $this->ajaxAction . '=' . $action; } /** * Установка или получение названия формы (префикс в имени при сохранении) * @param string|null $name * @return Form|string */ public function name(?string $name = null) { if (is_null($name)) { return $this->name; } $this->name = $name; return $this; } /** * Формирование имени для сохранения настроек * @param integer $fieldID ID поля * @return string */ public function configName($fieldID) { if ($this->onConfigName instanceof Closure) { return ($this->onConfigName)($fieldID); } if (isset($this->sysAdmin[$fieldID])) { return $this->sysAdmin[$fieldID]; } $name = '_form_' . ($this->name ?: $this->id) . '_'; do { if (! isset($this->fields[$fieldID])) { break; } $f = $this->fields[$fieldID]; if (! isset($this->tabs[ $f['tab'] ])) { break; } $tab = $this->tabs[ $f['tab'] ]; /** @var Input $field */ $field = $f['field']; $name .= $tab['name'] . '_' . $field->name(); } while (false); return $name; } /** * Добавление полей к конфигу расширения * @param $config */ public function appendConfigSettings(&$config) { foreach ($this->fields as $k => $v) { /** @var Input $field */ $field = $v['field']; $c = array( 'input' => 'custom', 'type' => TYPE_NOCLEAN, 'default' => $field->getDefault(), ); $config[ $this->configName($k) ] = $c; } } /** * Построение формы * @param array $data доп. данные шаблона * @return string HTML */ public function view(array &$data = []) { if ($this->onView instanceof Closure) { return ($this->onView)($data); } bff::log('Error usage ' . __CLASS__ . '::' . __FUNCTION__); return ''; } /** Событие сабмита формы * @param integer $recordID * @param array $post данные для для сабмита, [] - взять из $_POST * @param array $response @ref массив для ajax ответа */ public function recordSubmit($recordID, array $post = [], array &$response = []) { if ($this->onRecordSubmit instanceof Closure) { return ($this->onRecordSubmit)($recordID, $post, $response); } bff::log('Error usage ' . __CLASS__ . '::' . __FUNCTION__); } /** * Получение сохраненных данных из конфига расширения * @param integer $fieldID ID поля * @param mixed $default значение по умолчанию * @param mixed $opts * @return mixed */ public function config($fieldID, $default = '', $opts = []) { $key = $this->configName($fieldID); $data = $this->controller->config($key, $default, $opts); $field = $this->field($fieldID); $clean = $field->clean(); if (($clean == TYPE_ARRAY || $clean >= TYPE_ARRAY_BOOL) && is_string($data)) { $data = json_decode($data, true); } return $data; } /** * Сохранение данных в конфиг расширения * @param integer $fieldID ID поля * @param mixed $save данные * @param boolean $dynamic динамическая настройка */ public function configUpdate($fieldID, $save, $dynamic = false) { if (is_array($save)) { $save = json_encode($save, JSON_UNESCAPED_UNICODE); } $key = $this->configName($fieldID); $this->controller->configUpdate($key, $save, $dynamic); if (isset($this->sysAdmin[$fieldID])) { config::save($this->sysAdmin[$fieldID], $save); } } /** * Формирование значения атрибута name для тегов * @param integer $fieldID ID поля * @param string $prefix префикс * @return string */ public function _inputNameGenerator($fieldID, $prefix = '') { $name = ''; do { if (! isset($this->fields[ $fieldID ])) { break; } /** @var Input $field */ $field = $this->fields[ $fieldID ]['field']; if (empty($prefix)) { $tab = $this->fields[ $fieldID ]['tab']; if (! isset($this->tabs[ $tab ])) { break; } if (! empty($this->name)) { $name = $this->name . '[' . $this->tabs[$tab]['name'] . '][' . $field->name() . ']'; } else { $name = $this->tabs[$tab]['name'] . '[' . $field->name() . ']'; } } else { $name = $prefix . '[' . $field->name() . ']'; } } while (false); return $name; } /** * Сохранение значений для формы, событие submit * @return array */ public function submit() { $this->applyWhen(); $params = []; if (! empty($this->name)) { $params[$this->name] = TYPE_ARRAY; } else { foreach ($this->tabs as $v) { $params[ $v['name'] ] = TYPE_ARRAY; } } $replaceKey = function ($key) { return strtr($key, ['.' => '_', '-' => '_']); }; foreach ($params as $k => $v) { $key = $replaceKey($k); if ($key != $k) { $params[$key] = $v; unset($params[$k]); } } $data = $this->input->postm($params); if (! empty($this->name)) { $key = $replaceKey($this->name); $data = $data[$key] ?? []; } return $this->submitSave($data); } /** * Построение контента формы * @param array $data * @return string HTML */ public function content($data = []) { $this->applyWhen(); return parent::content($data); } }