Как в DIAFAN.CMS устроены списки
В административной части DIAFAN.CMS все табличные списки (новости, заказы, товары и т.д.) строятся по одному принципу. Ключевую роль играет массив $variables_list в файле modules/<модуль>/admin/*.admin.php. Разберём, что это за массив, как он связан с БД и почему одной строки с sql => true часто недостаточно.
$variables_list — это не «поля таблицы», а описание колонок
$variables_list — декларативная схема колонок списка: их порядок, заголовки, источник данных и способ отрисовки. Это отдельный контракт от $variables (форма редактирования) и от $table (таблица в БД).
Одна колонка в $variables_list может быть одного из нескольких типов:
| Тип колонки | Признаки | Пример |
|---|---|---|
| Прямое поле БД | 'sql' => true + 'type' => 'text'/'datetime'/… |
created, anons в news |
| Скрытое поле для данных | 'sql' => true + 'type' => 'none' |
text в order — в SELECT есть, колонки нет |
| Виртуальная / составная | без sql, свой list_variable_*() |
name в order, backend в order |
| Гибрид | sql + свой list_variable_*() |
summ, status_id, user_id в order |
| Служебная | без БД, обработчик в ядре | checkbox, adapt, actions |
Жизненный цикл списка
Жизненный цикл списка: от инициализации модуля до вывода HTML строки
1. Инициализация (Frame_admin::init())
После prepare_config() модуля ядро донастраивает колонку name. Если у колонки name указан параметр variable (например, 'variable' => 'id'), ядро автоматически добавляет в $variables_list скрытую запись для этого поля с sql => true и type => 'none'. Поле попадает в SELECT, но отдельной видимой колонки не создаёт.
// adm/includes/frame.php — фрагмент init()
if ($this->variable_list('name', 'variable'))
{
$this->variable_list($this->variable_list('name', 'variable'), 'sql', true);
if ($this->variable_list('name', 'variable') != 'name')
{
$this->variable_list($this->variable_list('name', 'variable'), 'type', 'none');
}
}
2. SQL (sql_query())
В SELECT попадают только поля с 'sql' => true. Файл: adm/includes/show.php.
foreach ($this->diafan->variables_list as $name => $var)
{
if (empty($var["sql"]))
continue;
$fields .= ', e.'.($this->diafan->variable_multilang($name) ? '['.$name.']' : $name);
}
Дополнительно модуль может расширить запрос через свойства $fields, $join, $where (вычисляемые поля, JOIN, условия).
3. Шапка (get_heading())
Итерирует $variables_list в том же порядке, что и строки таблицы. Пропускает колонки с type => 'none' и пустой placeholder-колонки backend.
4. Строки (rows())
Для каждого ключа $variables_list вызывается обработчик колонки:
$func = 'list_variable_'.preg_replace('/[^a-z_]+/', '', $name);
$result = call_user_func_array(array(&$this->diafan, $func), array($row, $var));
if ($result !== 'fail_function')
{
echo $result;
}
elseif (! empty($var["type"]) && $var["type"] != 'none')
{
// универсальный рендер по type: text, datetime, select, fast_edit…
}
Порядок разрешения:
list_variable_<имя>()в классе модуля (Order_admin,News_admin…);- если метода нет — через
Frame_admin::__call→Show_admin(ядро); - если вернулось
'fail_function'и естьtype≠none— универсальный рендер; - если
type => 'none'— ячейка не рисуется (данные уже в$rowдля других колонок).
Пример: модуль «Заказы» (order.admin.php)
В одном $variables_list собраны все основные паттерны:
public $variables_list = array (
'checkbox' => '',
'created' => array(
'name' => 'Дата и время',
'type' => 'datetime',
'sql' => true,
'no_important' => true,
),
'name' => array(
'name' => 'Заказ',
'variable' => 'id',
'text' => '№ %d',
),
'status_id' => array(
'name' => 'Статус',
'sql' => true,
),
'summ' => array(
'name' => 'Сумма',
'sql' => true,
),
'user_id' => array(
'name' => 'Покупатель',
'sql' => true,
),
'text' => array(
'sql' => true,
'type' => 'none',
),
'backend' => array(
),
'actions' => array(
'trash' => true,
),
);
| Колонка | Что происходит |
|---|---|
created |
sql + type=datetime → ядро list_variable_created() |
name |
виртуальная: list_variable_name() в модуле, данные из $row['id'] + sprintf('№ %d') |
status_id |
sql + кастомный list_variable_status_id() (цвет статуса) |
summ |
sql + кастомный list_variable_summ() (валюта, формат) |
user_id |
sql + кастомный list_variable_user_id() (ФИО, параметры заказа, $row['text']) |
text |
только данные: в SELECT есть, колонки нет (type=none) |
backend |
полностью виртуальная: list_variable_backend() подгружает расширения динамически |
Важно: колонка
nameв заказах не имеетsql => true, но ядро само подтягиваетidв SELECT через механизмvariable. Отображение «№ 21» задаётся вlist_variable_name()модуля, а не универсальным рендером.
Служебные колонки
Это тоже элементы $variables_list, но с фиксированной логикой в ядре (adm/includes/show.php):
checkbox— групповые операции;sort,plus— сортировка, дерево вложенности;adapt,separator— адаптивная вёрстка (на узком экране колонки сno_importantскрываются через CSS);actions— view / act / trash / del;image— миниатюра (shop);backend— placeholder под плагины (order).
Ключевые параметры колонки
| Параметр | Назначение |
|---|---|
name |
Заголовок колонки |
sql |
Включить поле в SELECT |
type |
Способ рендера: text, datetime, select, none… |
variable |
Для колонки name: из какого поля $row брать текст |
text |
Формат sprintf для отображаемого текста |
class, class_th |
CSS-классы ячейки и заголовка |
no_important |
Скрыть на узких экранах (адаптивность, не пользовательская настройка) |
fast_edit |
Inline-редактирование прямо в списке |
select, select_db |
Для type=select |
help |
Подсказка в заголовке колонки |
Связь с $variables (форма редактирования)
Это разные массивы с разным назначением:
$variables— поля формы edit/save;$variables_list— колонки списка.
Они могут пересекаться по имени (created, anons), но не обязаны. Поле может быть в форме, но не в списке — например, keywords в news. И наоборот: name в order — колонка списка с собственной логикой, а не просто поле таблицы.
Как добавить колонку в свой модуль
Простое поле из БД
Достаточно добавить запись в $variables_list:
'keywords' => array(
'name' => 'Ключевики',
'sql' => true,
'type' => 'text',
'class' => 'text',
'no_important' => true,
),
Ядро само добавит поле в SELECT и выведет усечённый текст через универсальный рендер.
Составная или нестандартная колонка
Добавьте ключ в $variables_list без sql (или с sql для вспомогательных полей) и реализуйте метод list_variable_<имя>($row, $var) в классе *_admin модуля. Метод должен вернуть HTML-строку (или вывести через echo, как list_variable_adapt).
Итог
$variables_list — это API модуля для списка, а не просто перечень полей таблицы. Разработчик описывает, какие колонки показывать, откуда брать данные и как их рисовать; ядро в adm/includes/show.php обеспечивает единый цикл: SQL → шапка → строки → обработчики.
Понимание этой схемы нужно при доработке существующих модулей и при создании новых: сначала проектируется $variables_list, затем при необходимости пишутся list_variable_*(), расширяются $fields / $join и настраивается prepare_config().
Документация: Административная часть, Администрирование модуля.
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.

