setTemplateName('group'); $this->isUnionAllowed = false; return true; } /** * Генерация основного контента поля * @param array $data @ref данные * @return string HTML */ public function view(array &$data = []) { $this->form->_fieldActivate($this->id()); if (! isset($data['name'])) { $data['name'] = $this->form->_inputNameGenerator($this->id); } $data['fields'] = & $this->fields; if (empty($this->title)) { $data['wrapper'] = ['colspan' => 2]; } # порядок вывода полей $priority = []; foreach ($this->fields as $k => $v) { $priority[$k] = $v['priority']; } asort($priority, SORT_NUMERIC); $data['priority'] = $priority; $data['inline'] = $this->inline; $data['sortable'] = $this->sortable; return $this->render($data); } /** * @param Input $field */ public function fieldAdd($field) { $field->group = true; parent::fieldAdd($field); } /** * Получение параметров ссылки для добавления нового элемента * @return string|array */ public function plus() { \func::array_defaults($this->plus, [ 'title' => _t('@', 'Add'), 'position' => 'before', 'type' => 'href', 'class' => [], ]); return $this->plus; } /** * Возвращаем название CSS класса блока * @param string $name * @return string */ public function cssClass($name = '') { return $this->form->cssClass('group-'.$this->id().'-'.$name); } /** * Генерация имени для javascript объекта * @return string */ public function jsObjectName() { return $this->form->jsObjectName('group'.$this->id()); } /** * Обработка ajax запросов * @return array|bool данные для ajax ответа */ public function ajax() { $id = $this->input->getpost('union_id', TYPE_UINT); if ($id != $this->id()) { return false; } # добавления нового блока $this->ajaxHandler('append-block', function () { $name = $this->input->postget('fname', TYPE_STR); $index = $this->input->postget('index', TYPE_UINT); $data = array( 'groupBlock' => false, 'groupAddMode' => 1, 'index' => $index, ); $this->view($data); if (! is_callable($data['groupBlock'], true)) { return []; } return $this->ajaxResponseForm([ 'index' => $index, 'html' => call_user_func($data['groupBlock'], $name), ]); }); return parent::ajax(); } /** * Проверка значения поля проверим значение всех входящих полей * @param array $data ['value' => &$value], 'value' - ссылка на значение поля * @return bool true - значение корректно, false - значение некорректно, пропустить (не сохраняется в БД) */ public function validate($data) { $result = []; $value = $data['value']; unset($value['__empty__']); foreach ($value as $k => $v) { $r = []; foreach ($this->fields as $f) { /** @var Input $field */ $field = $f['field']; $name = $field->name(); $clean = $field->clean(); if (! isset($v[$name])) { $v[$name] = $clean == TYPE_BOOL ? 0 : false; } if (! $field->validate(['value' => &$v[$name], 'index' => $k])) continue 2; $r[$name] = $v[$name]; } if (empty($r)) continue; $result[] = $r; } if (isset($this->onValidate['callable']) && is_callable($this->onValidate['callable'])) { if (! call_user_func($this->onValidate['callable'], ['value' => &$result, 'origin' => &$data], $this)) { return false; } } if ($this->isRequired()) { if (empty($result)) { $this->errors->set($this->required['message']); return false; } } # сохраняем с учетом $savedKey if ($this->savedKey) { $saved = $this->form->_ajaxData($this->id(), []); $saved[ $this->savedKey ] = $result; $data['value'] = $saved; } else { $data['value'] = $result; } return true; } /** * Установка значения поля при загрузке данных из БД * @param mixed $value */ public function setValue($value) { if ($this->savedKey && isset($value[ $this->savedKey ])) { $value = $value[ $this->savedKey ]; } parent::setValue($value); } /** * Получение значения поля выполняем вызов setValue для всех входящих полей * @param bool $lang только для указанного языка, если применимо * @return mixed */ public function value($lang = false) { $data = is_null($this->value) ? $this->getDefault() : $this->value; if (! empty($data)) { foreach ($data as &$v) { foreach ($this->fields as $f) { /** @var Input $field */ $field = $f['field']; $name = $field->name(); if (isset($v[$name])) { $field->setValue($v[$name]); $v[$name] = $field->value($lang); } } } unset($v); } return $data; } /** * Получение значения поля, без учета значений входящих полей * @return null */ public function rawValue() { return is_null($this->value) ? $this->getDefault() : $this->value; } }