ajaxAction = 'dynprops_action'; $this->setTemplateName('dynprops'); $this->isUnionAllowed = false; return true; } /** * Генерация основного контента поля * @param array $data @ref данные * @return string HTML */ public function view(array &$data = []) { $data['attr'] = $this->attr; $data['form'] = $this->form(); $jsName = $this->form->jsObjectName('dp'.$this->id()); $data['jsName'] = $jsName; $data['noJsRender'] = 1; $html = $this->render($data); $this->form->initionsJavascript($jsName, $this->jsRender()); return $html; } /** * Формирование HTML tr td врапера для поля * @param string $content контент, который необходимо обвернуть * @param array $opt @ref параметры * @return string HTML */ public function wrapper($content, array &$opt = []) { if (! isset($opt['wrapper'])) { $opt['wrapper'] = []; } if (! isset($opt['wrapper']['tr'])) { $opt['wrapper']['tr'] = ['class' => 'j-field-block']; } if (! empty($this->reloadIF['slave'])) { static::attrAdd($opt['wrapper']['tr'], 'class', 'j-reloadif-slave-' . $this->id()); $opt['wrapper']['reloadIf'] = [$this->form, '_reloadIfSlaveContent']; } $this->toggleIFClasses($opt['wrapper']['tr']); static::obCallable($content, $this->beforeRender, function($callable) use (&$content) { return call_user_func($callable, $content, $this); }); static::obCallable($content, $this->afterRender, function($callable) use (&$content) { return call_user_func($callable, $content, $this); }); if (isset($opt['wrapper']['reloadIf']) && is_callable($opt['wrapper']['reloadIf'])) { $content = call_user_func($opt['wrapper']['reloadIf'], $this, $content); } return '
' . $content .'
'; } /** * Генерация формы * @param int $value дначение овнера, для которого построить форму дс * @param bool $useData изпользовать згруденные данные формы Form или построить форму дс с пустыми данными * @return string HTML */ public function form($value = 0, $useData = true) { if (! $value) { $value = $this->owner->value(); } if (empty($value)) { return ''; } $url = $this->ajaxUrl() . 'action'; $this->dp->setSettings('act_action', mb_substr($url, mb_strpos($url, 'ev=') + 3)); $data = $useData && $this->form->recordID() ? $this->form->_data() : []; $form = $this->dp->form($value, $data, true, false, $this->dpKey, 'form.table'); if (! isset($form['form'])) { return ''; } return $form['form']; } /** * Обработка ajax запросов * @return array|bool данные для ajax ответа */ public function ajax() { # форма для нового значения овнера $this->ajaxHandler('form', function () { $value = $this->input->postget('owner_value', TYPE_UINT); return $this->ajaxResponseForm(['html' => $this->form($value, false)]); }); # проброс ajax запросов для компонента дин.свойств $this->ajaxHandler('action', function () { $response = $this->dp->action(); if ($response instanceof Response) { return $this->response($response); } return $response; }); return parent::ajax(); } /** * Список полей при построении запроса к БД * @return array */ public function fieldsList() { $fields = []; $prefix = $this->dp->datafield_prefix; for ($i = $this->dp->datafield_int_first; $i <= $this->dp->datafield_int_last; $i++) { $fields[] = $prefix.$i; } for ($i = $this->dp->datafield_text_first; $i <= $this->dp->datafield_text_last; $i++) { $fields[] = $prefix.$i; } return $fields; } /** * Проверка значения поля * @param array $data ['value' => &$value], 'value' - ссылка на значение поля * @return bool true - значение корректно, false - значение некорректно, пропустить (не сохраняется в БД) */ public function validate($data) { unset($data['value']['__empty__']); $dpData = []; foreach ($data['value'] as $props) { foreach ($props as $id => $vv) { $dpData[$id] = $vv; } } $dpProps = $this->dp->getByID(array_keys($dpData), true); $prepare = $this->dp->prepareSaveDataByID($dpData, $dpProps, 'update', true); if (isset($this->onValidate['callable']) && is_callable($this->onValidate['callable'])) { $result = call_user_func($this->onValidate['callable'], ['value' => &$prepare], $this); if (! $result) return false; } $data['result'] = array_merge($data['result'], $prepare); return false; } }