Автоматическое построение списка опций

В контроллере табличного администрирования широко используются элементы управления, содержащие в себе некий список опций для выбора. Это, например, поля типов 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.

Метки: CMS
06.04.2016
Все статьи