Автоматическое построение списка опций
В контроллере табличного администрирования широко используются элементы управления, содержащие в себе некий список опций для выбора. Это, например, поля типов select, multilink, др. в формах редактирования, элементы формы фильтров. Элементы выводятся в специальном формате в параметре items.
Прямое описание массива
Прямое описание списка опций представляет собой ассоциативный массив.
'news_type' => array( 'type' => 'select', 'items' => array( 0 => 'Нет', 1 => 'Политика', 2 => 'Культура', 3 => 'Спорт', ), ),
Такой вариант подойдет для списка, который либо не будет изменяться, либо изменения будут незначительные. Длинные списки также не очень удобно хранить непосредственно в описании поля.
Для этого можно воспользоваться одним из механизмов хранения опций.
Хранение списка в настройках
В разделе админки «Настройки системы администрирования» необходимо создать переменную типа массив и перечислить там все варианты.
// переменная news.types 0 = Нет 1 = Политика 2 = Культура 3 = Спорт
Тогда параметр items будет строкой вида var:имя переменной.
'news_type' => array( 'type' => 'select', 'items' => 'var:news.types', ),
Хранение списка в БД
Если список хранится в БД, тогда в параметре items указываем имя маппера - orm:name_mapper.
'news_type' => array( 'type' => 'select', 'items' => 'orm:types', ),
Если есть субмаппер, созданный через функцию вида map_submapper, он указывается через слэш.
'items' => 'orm:cities/submapper'
Иногда требуется указать нулевое значение ("Тип не указан"). Т.к. список хранится в таблице, а в ней нет такой записи, то можно записать следующим образом:
'items' => array( '0' => 'Нет типа', 'orm:types',
Произвольный алгоритм формирования списка
1. Если список должен формироваться по сложному алгоритму в зависимости от разных параметров, то можно указать метод пользовательского контроллера, который будет собирать список:
'items' => ':type_list'
Сам метод необходимо описать в контроллере.
public function type_list() { $list = array(); //......... // Здесь мы собираем список return $list; }
2. Можно использовать статический метод произвольного класса:
'items' => 'App.Utils::type_list',
3. Можно применить callback-функцию в виде обычного массива или в виде специального объекта Core::Call.
'items' => array( 0 => 'Нет', function () { return CMS::orm()->types->spawn()->where('flag = 1'); } ),
'items' => Core::Call(WS::env()->orm->users->calculate('name title')->only('id', 'title'), 'select')->cache(),
Можно передать маппер, тогда автоматически вызовется select
'items' => WS::env()->orm->news_types,
Формирование списка за пределами админского контроллера
Для получения массива опций за пределами админского контроллера необходимо вызвать метод CMS::items_for_select().
$items = CMS::items_for_select('orm:news_types');
Передавать аргумент можно в любом формате, описанном для свойства items.