ajaxAction = 'autocomplete_action'; $this->setTemplateName('autocomplete'); $this->isUnionAllowed = true; return true; } /** * Генерация основного контента поля * @param array $data @ref данные * @return string HTML */ public function view(array &$data = []) { $name = ''; if (isset($data['name'])) { $name = $data['name']; } $attr = $this->attr; if (! empty($this->values) && is_string($this->values)) { static::attrAdd($attr, 'value', HTML::escape($this->values)); } static::attrAdd($attr, 'type', 'text'); if (! isset($attr['placeholder'])) { static::attrAdd($attr, 'placeholder', $this->placeholder); } static::attrAdd($attr, 'class', 'j-autocomplete'); $hidden = $this->hidden; static::attrAdd($hidden, 'type', 'hidden'); static::attrAdd($hidden, 'name', $name); static::attrAdd($hidden, 'class', 'j-value-input'); static::attrAdd($hidden, 'value', HTML::escape($this->value())); $data['hidden'] = $hidden; $data['attr'] = $attr; $union = $this->unionID(); if ($union) { $union = 'Union'.$union; } $jsName = $this->form->jsObjectName($union.'autocomplete'.$this->id()); $data['jsName'] = $jsName; $data['noJsRender'] = 1; $html = $this->render($data); $this->form->initionsJavascript($jsName, $this->jsRender()); return $html; } /** * Установка значения поля при загрузке данных из БД * @param mixed $value */ public function setValue($value) { parent::setValue($value); if (is_callable($this->valuesCallback, true)) { $this->values = call_user_func($this->valuesCallback, $this->value, $this); } } /** * Установить или вернуть параметры для обязательного заполнения * @param array|null * @return array */ public function required($data = null) { $result = parent::required($data); $result['js'] = function ($r) { return 'if ($f.length) { '. 'var $fbl = $f.closest(\'.j-field-block\'); '. 'if (! intval($fbl.find(\'.j-value-input\').val())) { '. '$fbl.find(\'.j-autocomplete\').focus(); '. 'bff.error(\'' . HTML::escape($r['message'], 'js') . '\'); '. '$f.closest(\'.j-field-block\').addClass(\'has-error\'); '. 'error = true; '. (! empty($r['return']) ? 'return false; ' : ''). ' } } ' . PHP_EOL; }; return $result; } /** * Обработка ajax запросов * @return array|bool данные для ajax ответа */ public function ajax() { # значения для автокомплитера тегов $this->ajaxHandler('autocomplete', function () { $q = $this->input->post('q', TYPE_NOTAGS); if (is_callable($this->autocompleteCallback, true)) { $response = call_user_func($this->autocompleteCallback, $q, $this); } return $this->ajaxResponse($response); }); return parent::ajax(); } /** * Добавление класса для инпута * @param string|array $name название класса или классов * @return Input */ public function classAdd($name) { static::attrAdd($this->hidden, 'class', $name); return $this; } /** * Удаление класса для инпута * @param string|array $name название класса или классов * @return Input */ public function classRemove($name) { static::attrRemove($this->hidden, 'class', $name); return $this; } }