Как в 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

Жизненный цикл списка

Диаграмма: жизненный цикл списка в админке DIAFAN.CMS

Жизненный цикл списка: от инициализации модуля до вывода 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…
}

Порядок разрешения:

  1. list_variable_<имя>() в классе модуля (Order_admin, News_admin…);
  2. если метода нет — через Frame_admin::__callShow_admin (ядро);
  3. если вернулось 'fail_function' и есть typenoneуниверсальный рендер;
  4. если 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().


Документация: Административная часть, Администрирование модуля.

Комментарии

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