CONTENT MANAGEMENT SYSTEM
Blox Logo
Blox CMS — блочный метод сайтостроения
.
 
Blox Help


В данных типа select воплощены принципы реляционных баз данных.

Реляционная модель данных представляет информацию в виде совокупности таблиц, связанных между собой посредством совместно используемых полей данных, называемых ключами.

←→

Данные типа select
(выбор данных из списка)

Независимые списки

Если вы хотите, чтобы при редактировании какого-то поля, можно было выбирать значения из фиксированного списка, то самый простой способ — это применить стандартные mysql-типы SET или ENUM, например:

.tdd

$types[2] = "set('красный', 'желтый', 'зеленый')";
Однако, этот список задается разработчиком, и пользователь не может его редактировать (если он не имеет доступ к файлу .tdd). Как быть, когда этот список должен часто изменяться? Например, на одной из страниц сайта вы ведете таблицу заказов, в одном из полей которого вы хотите иметь выпадающий список с названием региона (области, республики, края), из которого поступил заказ. Было бы разумнее иметь отдельный редактируемый блок с названиями регионов, чтобы редактор мог легко добавлять новые регионы. Для таких случаев используется тип select.

Как создать данное типа select?

Допустим, в дескрипторе шаблона заказов accounts.tdd, мы хотим иметь данное, значение которого должно выбираться из списка регионов. Пусть это данное находится в поле 2. Тогда в дескрипторе этого шаблона нужно добавить тип select:

accounts.tdd

$titles[1] = 'Клиент';
$titles[2] = 'Выберите регион';

$types[1] = 'varchar(99)';
$types[2] = "select template('regions') field(1)";

где regions - это имя шаблона, на основе которого отдельно на любой странице должен быть создан блок со списком регионов. В блоке со списком регионов может быть несколько полей, но в качестве списка будет использоваться только поле 1.

regions.tdd

$titles[1] = 'Название региона';
$types[1] = 'varchar(255)';
$params['isMultiRec'] = true;

В дескрипторе заказов (accounts.tdd) указывается шаблон (regions), но ничего не говорится о блоке, из которого формируется список регионов — его должен назначить сам пользователь системы управления.

Замена списка в Blox CMS

Когда редактор в блоке заказов начинает редактировать первую запись, то в поле для выбора региона еще нет никакого списка. Чтобы его назначить, нужно щелкнуть по небольшой кнопке (см. снимок), которая находится справа от поля с соответствующим select–данным (кнопка видна только администратору и главному редактору). Откроется окно для выбора списка. В этом окне будут представлены все блоки, созданные на основе шаблона regions.

Зависимые (связанные) списки

Что такое зависимые, или связанные, списки? Это когда список значений одного выпадающего списка зависит от значения, выбранного в другом выпадающем списке. Такие списки очень удобны, если вам надо выбрать некий объект с определенными характеристиками.

Усложним предыдущую задачу. Теперь в каждом заказе, кроме региона, будем указывать и город. То есть, после выбора того или иного региона, в другом поле можно выбрать город из этого региона.

Как создать данное типа select, зависимое от другого select–данного?

Продолжим работать с теми же шаблонами. Дескриптор шаблона заказов (accounts.tdd) будет таким же, как в предыдущем примере, только добавится новое данное в поле 3. Его тип объявляется аналогично select–данному в поле 2. То есть, указывается шаблон, который должен иметь блок–претендент на список городов (в нашем случае — это шаблон cities), и указывается поле, из которого формируется список.

accounts.tdd

$titles[1] = 'Клиент';
$titles[2] = 'Выберите регион';
$titles[3] = 'Выберите город';

$types[1] = 'varchar(99)';
$types[2] = "select template('regions') field(1)";
$types[3] = "select template('cities')  field(1) parentEditField(2)";

В зависимых select–данных, кроме этого, добавляется параметр parentEditField — родительское поле редактирования, то есть, поле 2, от значения которого будет зависеть список значений поля 3.

Внимание! Тип зависимого select–данного должен быть объявлен после объявления типа родительского данного. При этом, значение ключа массива $types не важно.

Например, поле для выбора региона в дескрипторе accounts.tdd могло бы находиться и в поле 4. Но тогда переменная $types[4] должна быть обязательно записана выше переменной $types[3], в которой задается город.

cities.tdd

$titles[1] = 'Название города';
$types[1] = 'varchar(255)';
$params['isMultiRec'] = true;

Структура данных шаблона cities такая же, как у шаблона regions.

regions.tdd

$titles[1] = 'Название региона';
$types[1] = 'varchar(255)';
$params['isMultiRec'] = true;

Так же, как и для списка регионов, для списков городов на любой странице нужно создать блок на шаблоне cities.

На этот раз таких блоков будет очень много (один блок со списком городов на каждый регион). Поэтому имеет смысл создать отдельную, так сказать, географическую страничку. Такую страничку можно построить, например, на блоке, каждая запись которого, кроме наименования региона, будет включать в себя блок со списком городов.

Блоки со списками абсолютно не зависят от select–данных — это select–данные зависят от них, используюя один из столбцов в качестве списка. Записи о регионах и городах могут иметь и дополнительные поля, например, поля с информацей о площади территории, численности населения и т.п. В этих блоках можно добавлять и удалять записи, сохранять сортировки, и всё это будет отражаться на выпадающем списке select–данного.

Если регион не связан с соответствующим списком городов, поле для выбора города будет пустым.

Чтобы какому-либо региону назначить список городов, нужно щелкнуть по небольшой кнопке, которая находится справа от поля с соответствующим select–данным (кнопка видна только администратору и главному редактору). Естественно, перед этим должна быть выбрана опция из родительского списка (регион).

Откроется окно для выбора списка. В этом окне будут представлены все блоки, созданные на основе шаблона cities.

Зависимый список привязывается к опции из родительского списка только один раз. При редактировании другого данного, после выбора такой же опции, в зависимом поле автоматически будет сформирован нужный список.

Параметры select–данного

Имя параметраНазначение параметраЗначение
templateШаблон блока, из которого берется список.Имя шаблона
fieldПоле, указанного выше шаблона, данные которого будут использоваться в качестве списка.Номер поля
parentEditFieldРодительское поле в редактируемом шаблоне, от записей которого будут зависеть списки в редактируемом поле. Применяется в зависимых спискахНомер поля
keyFieldКлючевое поле, в котором храняться номера родительских записей. Применяется в зависимых списках.Номер поля
controlsПеречень дополнительных кнопок управления списком (редактировать пункт, добавить пункт, удалить пункт)Полный возможный перечень: 'edit','add','delete'


Альтернативная (короткая) форма записи параметров данных типа select

Существует альтернативная форма записи, когда названия параметров не используются (кроме параметра controls). Значения этих параметров можно записать в скобках после имени типа (то есть, после слова select).

.tdd


$types[2] = "select template('regions') field(1)  controls('edit','add')";
$types[2] = "select('regions', 1) controls('edit','add')";

$types[3] = "select template('cities')  field(1) parentEditField(2)  keyField(2)";
$types[3] = "select('cities', 1, 2, 2)";

Значения нужно записывать через запятую в такой последовательности: template, field, parentEditField, keyField.

Примечания

  • Число зависимых уровней select–данных в записи не ограничено. То есть, зависимый список можно связать не только с опцией из независимого списка, но и с опцией из зависимого списка. Например, в рассмотренном выше примере можно добавить третье select–данное со списком улиц города.
  • В таблице базы данных в качестве значения данного типа select хранится идентификатор строки из блока со списком, однако, на страничке будут отображаться не идентификаторы, а подставляться значение из блока со списком.

    Более того, запросы сортировки и поиска к полям select будут производиться так, как будто там храняться не идентификаторы, а данные.

  • Если пользователю приходится вводить много записей с одинаковыми данными из полей типа select, то можно сделать так, чтобы эти данные вводились автоматически.

    Предлагаемый метод будет работать только в том случае, если к этим полям производится запрос условной выборки. Значения полей будут браться из массива $GLOBALS['pick'] и сохраняться с помощью массива $defaults (значения по умолчанию) в дескрипторе. Пример применения $defaults можно посмотреть в коде "Каталог товаров (pick-навигация)"


См. также