'title'] */ protected $options = []; /** @var array значения по умолчанию ['name' => checked] */ protected $default = []; /** @var bool возможность перетягивания */ protected $sortable = false; /** @var int максимальная высота блока */ protected $maxHeight = 0; /** * Инициализация поля * @return bool */ public function init() { if (! parent::init()) { return false; } $this->setTemplateName('checkboxlist'); $this->isUnionAllowed = true; return true; } /** * Генерация основного контента поля * @param array $data @ref данные * @return string HTML */ public function view(array &$data = []) { $union = $this->unionID(); if ($union) { $union = 'Union' . $union; } $data['union'] = $union; $jsName = $this->form->jsObjectName($union . 'checkboxList' . $this->id()); $data['jsName'] = $jsName; if ($this->sortable) { $data['noJsRender'] = 1; } $data['sortable'] = $this->sortable; $this->prepareOptions(); $options = $this->options; if (! is_array($options)) { $options = []; } $data['options'] = $options; $value = $this->value(); if (empty($this->sortable)) { $order = []; foreach ($this->options as $k => $v) { $order[$k] = $value[$k]; } $value = $order; } $data['value'] = $value; $attr = $this->attr; static::attrAdd($attr, 'type', 'checkbox'); if (! isset($attr['value'])) { static::attrAdd($attr, 'value', '1'); } $data['attr'] = $attr; $data['maxHeight'] = $this->maxHeight; $html = $this->render($data); $this->form->initionsJavascript($jsName, $this->jsRender()); return $html; } /** * Добавление чекбокса * @param string $name имя * @param string $title заголовок * @param bool $checked по умолчанию */ public function option($name, $title, $checked) { $this->options[$name] = $title; $this->default[$name] = $checked; } /** * Проверка значения поля * @param array $data ['value' => &$value], 'value' - ссылка на значение поля * @return bool true - значение корректно, false - значение некорректно, пропустить (не сохраняется в БД) */ public function validate($data) { unset($data['value']['__empty__']); $this->prepareOptions(); foreach ($this->options as $k => $v) { if (! isset($data['value'][$k])) { $data['value'][$k] = 0; } } return parent::validate($data); } /** * Установка значения поля при загрузке данных из БД * @param mixed $value */ public function setValue($value) { parent::setValue($value); $this->prepareOptions(); if (! is_array($value)) { $value = []; } foreach ($value as $k => $v) { if (! isset($this->options[$k])) { unset($value[$k]); } } } /** * Получение значения поля * @param bool $lang только для указанного языка, если применимо * @return mixed */ public function value($lang = false) { $this->prepareOptions(); $value = parent::value(false); if (! is_array($value)) { $value = []; } foreach ($this->options as $k => $v) { if (! isset($value[$k]) && isset($this->default[$k])) { $value[$k] = $this->default[$k]; } } return $value; } /** * Подготовка options */ protected function prepareOptions() { if (is_callable($this->options)) { $options = call_user_func($this->options, $this); $this->options = []; foreach ($options as $v) { if (! isset($v['id']) || ! isset($v['title'])) { continue; } $this->option($v['id'], $v['title'], ! empty($v['checked'])); } } if (is_array($this->options)) { foreach ($this->options as $k => $v) { if (! isset($this->default[$k])) { $this->default[$k] = false; } } } } /** * Получения списка options * @return array */ public function options() { return $this->options; } }