* @copyright Tamaranga
*/
class Select extends Input
{
/**
* @var mixed настройка невыбранного значения
* false - не добавлять вариант "Не выбрано";
* string - название;
* array(id,title) - id + название
* callable - функция, вызываемая перед отрисовкой, должна вернуть один из вышеперечисленных вариантов
*/
protected $empty = null;
/** @var array|callable|bool список вариантов значений ['id' => ['id' => id, 'title' => title] */
protected $options = [];
/** @var string ключ ID пунктов */
protected $optionsID = 'id';
/** @var string ключ названия пунктов */
protected $optionsTitle = 'title';
/** @var array дополнительные "data-" атрибуты */
protected $optionsDataAttributes = [];
/** @var bool показывать описания к вариантам значений */
protected $showHelp = false;
/** @var bool владелец дин свойств */
public $ownerDP = false;
/**
* Инициализация поля
* @return bool
*/
public function init()
{
if (! parent::init()) {
return false;
}
$this->setTemplateName('select');
$this->isUnionAllowed = true;
return true;
}
/**
* Генерация основного контента поля
* @param array $data @ref данные
* @return string HTML
*/
public function view(array &$data = [])
{
if (! isset($data['name'])) {
$data['name'] = '';
}
$data['attr'] = $this->attr;
$empty = false;
if (! empty($this->empty)) {
if (is_callable($this->empty)) {
$empty = call_user_func($this->empty, $this);
} else {
$empty = $this->empty;
}
}
$options = '';
if (is_callable($this->options)) {
$options = call_user_func($this->options, $this);
} else if (is_array($this->options) || is_string($this->options)) {
$options = $this->options;
}
$data['help'] = [];
if (is_array($options)) {
if ($this->showHelp) {
foreach ($options as $v) {
if (empty($v['help'])) {
continue;
}
if (! isset($v[$this->optionsID])) {
continue;
}
$key = $v[$this->optionsID];
if (is_bool($key)) {
$key = (int)$key;
}
$data['help'][$key] = $v['help'];
}
if (empty($data['help'])) {
$this->showHelp = false;
}
}
}
$data['showHelp'] = $this->showHelp;
if (is_array($options)) {
$options = HTML::selectOptions($options, $this->value(), $empty, $this->optionsID, $this->optionsTitle, $this->optionsDataAttributes);
}
$data['options'] = $options;
return $this->render($data);
}
/**
* Добавление