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;
}
}