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