Файл admin.config.php в Cotonti CMF
Основное назначение файла и его место в системе
Файл admin.config.php является частью административной панели системы управления контентом Cotonti CMF. Он отвечает за управление конфигурациями сайта, предоставляя интерфейс для настройки различных параметров системы и её расширений через административную панель. Это важный компонент для работы с настройками как "ядерных" (основных) функций, так и для установки и настройки расширений (модулей и плагинов).
Файл является частью модуля "Конфигурация" и служит для:
- Редактирования конфигурационных опций как для ядра системы, так и для отдельных расширений (модулей и плагинов).
- Сохранения изменений конфигураций.
- Обработки условий для разных типов конфигураций (например, для
core,module,plug). - Выводит формы для редактирования настроек и обработки событий, таких как обновления конфигурации или сброс настроек.
Суть содержания кода и выполняемые задачи
-
Авторизация и доступ:
- Код проверяет, является ли текущий пользователь администратором, через функцию
cot_auth(), и вызывает функциюcot_block(), чтобы запретить доступ пользователям без прав администратора.
- Код проверяет, является ли текущий пользователь администратором, через функцию
-
Подключение необходимых файлов:
- Подключение файла
configurationдля работы с конфигурационными данными системы.
- Подключение файла
-
Хуки:
- Используется несколько хуков (
cot_getextplugins()), что позволяет другим модулям или плагинам добавлять свою функциональность на разных этапах обработки конфигурации.
- Используется несколько хуков (
-
Редактирование конфигурации:
- Определены различные действия для редактирования конфигураций, такие как обновление или сброс настроек. Код выполняет проверку POST-запросов для сохранения изменений.
-
Отображение конфигурационных данных:
- Формируются данные для отображения в административной панели, включая категории конфигураций, иконки и описания для каждой категории настроек.
- Выводятся различные формы с конфигурационными параметрами, которые могут быть обновлены или сброшены.
-
Обработка расширений:
- Для расширений (модулей и плагинов) извлекаются и отображаются данные о конфигурациях с возможностью редактирования для каждого расширения.
-
Вывод сообщений:
- В случае успешных или частичных обновлений отображаются сообщения об успешном обновлении конфигурации или ошибках.
Методы и функции, используемые в файле
- cot_auth() — Функция для получения прав доступа пользователя.
- cot_block() — Функция для блокировки доступа, если у пользователя нет прав.
- cot_getextplugins() — Функция для получения хуков расширений.
- cot_import() — Функция для импорта данных из URL.
- cot_config_list() — Функция для получения списка конфигурационных настроек.
- cot_config_update_options() — Функция для обновления конфигурационных опций.
- cot_config_reset() — Функция для сброса конфигурационных настроек.
- cot_langfile() — Функция для загрузки языкового файла для расширений.
- cot_tplfile() — Функция для получения пути к шаблону.
- cot_redirect() — Функция для перенаправления пользователя.
- cot_message() — Функция для отображения сообщений пользователю.
- cot_display_messages() — Функция для отображения сообщений, собранных во время выполнения.
Характеристика стиля PHP
-
Использование объектно-ориентированного подхода:
- Хотя в коде присутствуют вызовы функций, работа с шаблонами (
XTemplate), а также использование объектов и классов (например,Cot::$cache), код в целом остаётся процедурным.
- Хотя в коде присутствуют вызовы функций, работа с шаблонами (
-
Модульность и расширяемость:
- Активное использование хуков и плагинов для расширения функциональности. Внешние модули могут легко интегрироваться в административную панель через хуки
cot_getextplugins().
- Активное использование хуков и плагинов для расширения функциональности. Внешние модули могут легко интегрироваться в административную панель через хуки
-
Безопасность:
- Использование проверок типа
defined('COT_CODE') && defined('COT_ADMIN')для защиты от прямого доступа к файлу.
- Использование проверок типа
-
Управление сессиями и правами доступа:
- В коде активно используется система прав и аутентификации пользователей с административными правами.
-
Обработка данных и запросов:
- Обработка пользовательских запросов с использованием глобальных переменных, таких как
$_POST, с валидацией и фильтрацией данных через функции типаcot_import().
- Обработка пользовательских запросов с использованием глобальных переменных, таких как
-
Гибкость и настройки:
- Гибкая система конфигураций позволяет администратору настраивать различные параметры сайта через одну административную панель, используя различные типы данных и поля.
Заключение
Файл admin.config.php является ключевым компонентом для управления конфигурациями в административной панели Cotonti. Он предоставляет мощный и гибкий интерфейс для работы с конфигурациями ядра системы, а также с расширениями (модулями и плагинами), и активно использует хуки для обеспечения расширяемости и интеграции с другими модулями. Код написан с учётом модульности и гибкости, что позволяет легко добавлять новые функции и интегрировать дополнительные модули в систему.
находится по адресу: /system/admin/admin.config.php движка php-фреймворка
<?php
/**
* Administration panel - Configuration
*
* @package Cotonti
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
(defined('COT_CODE') && defined('COT_ADMIN')) or die('Wrong URL.'); // Проверка, что файл был вызван в контексте системы Cotonti и из административной панели
list($usr['auth_read'], $usr['auth_write'], $usr['isadmin']) = cot_auth('admin', 'a'); // Проверка прав пользователя на доступ к административной панели
cot_block($usr['isadmin']); // Блокировка доступа, если пользователь не является администратором
require_once cot_incfile('configuration'); // Подключение файла, содержащего логику для работы с конфигурацией
$adminTitle = $L['Configuration']; // Установка заголовка страницы в административной панели
$t = new XTemplate(cot_tplfile('admin.config', 'core')); // Создание нового объекта XTemplate для работы с шаблоном страницы
/* === Hook === */
foreach (cot_getextplugins('admin.config.first') as $pl) { // Подключение и выполнение плагинов, если они существуют
include $pl; // Включение плагинов
}
/* ===== */
switch ($n) { // Начало блока условий, в котором проверяется значение переменной $n
case 'edit': // Если значение переменной $n равно 'edit'
$o = cot_import('o', 'G', 'ALP'); // Импорт значения параметра 'o' из GET-запроса, ожидается строка
$p = cot_import('p', 'G', 'ALP'); // Импорт значения параметра 'p' из GET-запроса, ожидается строка
$v = cot_import('v', 'G', 'ALP'); // Импорт значения параметра 'v' из GET-запроса, ожидается строка
$o = empty($o) ? 'core' : $o; // Если переменная $o пуста, присваиваем ей значение 'core'
$p = empty($p) ? 'global' : $p; // Если переменная $p пуста, присваиваем ей значение 'global'
$optionslist = cot_config_list($o, $p, ''); // Получаем список конфигурационных параметров по заданным значениям $o и $p
cot_die(!sizeof($optionslist), true); // Завершаем выполнение, если список пуст
$configExtensionLangFile = cot_langfile($p, $o); // Получаем путь к языковому файлу конфигурации для расширения
if ($o !== 'core' && file_exists($configExtensionLangFile)) { // Если $o не равно 'core' и файл существует
require $configExtensionLangFile; // Подключаем языковой файл конфигурации
} else {
$configExtensionLangFile = null; // Если файл не существует, сбрасываем переменную
}
if ($o != 'core' && file_exists(cot_incfile($p, $o))) { // Если $o не равно 'core' и файл существует
require_once cot_incfile($p, $o); // Подключаем основной файл конфигурации для расширения
}
/* === Hook === */
foreach (cot_getextplugins('admin.config.edit.first') as $pl) { // Подключение и выполнение плагинов для редактирования конфигурации
include $pl; // Включение каждого плагина
}
/* ===== */
if ($a == 'update' && !empty($_POST)) { // Если параметр $a равен 'update' и POST-запрос не пуст
$updated = cot_config_update_options($p, $optionslist, $o); // Обновляем параметры конфигурации с помощью функции cot_config_update_options
$errors = cot_get_messages('', 'error'); // Получаем список ошибок после выполнения операции
if ($o == 'module' || $o == 'plug') { // Если $o равно 'module' или 'plug'
$dir = $o == 'module' ? $cfg['modules_dir'] : $cfg['plugins_dir']; // Если $o равно 'module', определяем директорию для модулей, иначе для плагинов
// Выполняем настройку расширения, если файл configure.php существует
if (file_exists($dir . "/" . $p . "/setup/" . $p . ".configure.php")) { // Если файл конфигурации для расширения существует
include $dir . "/" . $p . "/setup/" . $p . ".configure.php"; // Подключаем файл настройки расширения
}
}
/* === Hook === */
foreach (cot_getextplugins('admin.config.edit.update.done') as $pl) { // Запуск плагинов, если они существуют, после завершения обновления
include $pl; // Подключение каждого плагина
}
/* ===== */
$cache && $cache->clear(); // Если кеш существует, очищаем его
if ($updated) { // Если конфигурация была обновлена
$errors ? cot_message('adm_partially_updated', 'warning') : cot_message('Updated'); // Если есть ошибки, выводим предупреждение, иначе сообщение об успешном обновлении
} else {
if (!$errors) cot_message('adm_already_updated'); // Если обновление не требуется, выводим сообщение, что изменений не было
}
} elseif ($a == 'reset' && !empty($v)) { // Если параметр $a равен 'reset' и $v не пуст
cot_config_reset($p, $v, $o, ''); // Сбрасываем конфигурацию с помощью функции cot_config_reset
$optionslist = cot_config_list($o, $p, ''); // Перегружаем список опций конфигурации
/* === Hook === */
foreach (cot_getextplugins('admin.config.edit.reset.done') as $pl) { // Запуск плагинов после сброса конфигурации
include $pl; // Подключение каждого плагина
}
/* ===== */
Cot::$cache && Cot::$cache->clear(); // Если кеш существует, очищаем его
cot_redirect(cot_url('admin', array('m'=>'config', 'n'=>'edit', 'o'=>$o, 'p'=>$p), '', true)); // Перенаправляем пользователя на страницу редактирования конфигурации
}
if ($o == 'core') { // Если параметр $o равен 'core'
$adminPath[] = array(cot_url('admin', 'm=config'), $L['Configuration']); // Добавляем ссылку на страницу настроек в путь навигации
$adminPath[] = [ // Добавляем ссылку на текущую страницу редактирования настроек
cot_url('admin', 'm=config&n=edit&o=' . $o . '&p=' . $p), // Ссылка на страницу редактирования для параметра $o и $p
isset(Cot::$L['core_' . $p]) ? Cot::$L['core_' . $p] : $p, // Заголовок страницы. Если локализованная строка для $p существует, используем её, иначе показываем $p
];
} else { // Если параметр $o не равен 'core'
$adminPath[] = array(cot_url('admin', 'm=extensions'), $L['Extensions']); // Добавляем ссылку на страницу расширений в путь навигации
$plmod = $o == 'module' ? 'mod' : 'pl'; // Определяем тип расширения (модуль или плагин)
$ext_info = cot_get_extensionparams($p, $o == 'module'); // Получаем информацию о расширении с помощью функции cot_get_extensionparams
$adminPath[] = array(cot_url('admin', "m=extensions&a=details&$plmod=$p"), $ext_info['name']); // Добавляем ссылку на страницу расширения с его именем в путь навигации
$adminPath[] = array(cot_url('admin', 'm=config&n=edit&o=' . $o . '&p=' . $p), $L['Configuration']); // Добавляем ссылку на страницу конфигурации расширения
}
/* === Hook === */ // Начало блока хуков для расширений, которые могут быть подключены в этой части
foreach (cot_getextplugins('admin.config.edit.main') as $pl) { // Проходим по всем расширениям, подключаемым к хуку 'admin.config.edit.main'
include $pl; // Подключаем каждое расширение
}
/* ===== */ // Конец блока хуков
// Предотвращаем перезапись строк языка другими расширениями
if ($configExtensionLangFile) { // Если файл языковой локализации для расширения существует
require $configExtensionLangFile; // Подключаем языковой файл
}
/* === Hook - Part1 : Set === */ // Начало блока хуков для расширений в этом разделе
$extp = cot_getextplugins('admin.config.edit.loop'); // Получаем все расширения, подключаемые к хуку 'admin.config.edit.loop'
/* ===== */ // Конец блока хуков
foreach ($optionslist as $key => $row) { // Проходим по всем элементам конфигурации
list($title, $hint) = cot_config_titles($row['config_name'], $row['config_text']); // Получаем заголовок и подсказку для конфигурации
if (
$row['config_subcat'] == '__default' // Если подкатегория элемента конфигурации равна '__default'
&& $prev_subcat == '' // И предыдущая подкатегория была пустой
&& $row['config_type'] != COT_CONFIG_TYPE_SEPARATOR // И тип конфигурации не является разделителем
) {
$t->assign('ADMIN_CONFIG_FIELDSET_TITLE', $L['adm_structure_defaults']); // Устанавливаем заголовок для секции
$t->parse('MAIN.EDIT.ADMIN_CONFIG_ROW.ADMIN_CONFIG_FIELDSET_BEGIN'); // Начинаем парсинг секции
}
if ($row['config_type'] == COT_CONFIG_TYPE_SEPARATOR) { // Если тип конфигурации является разделителем
$t->assign('ADMIN_CONFIG_FIELDSET_TITLE', $title); // Устанавливаем заголовок раздела
$t->parse('MAIN.EDIT.ADMIN_CONFIG_ROW.ADMIN_CONFIG_FIELDSET_BEGIN'); // Начинаем парсинг раздела
} else { // Если это не разделитель
$t->assign([ // Устанавливаем значения для текущего элемента конфигурации
'ADMIN_CONFIG_ROW_CONFIG' => cot_config_input($row), // Генерируем форму для ввода конфигурации
'ADMIN_CONFIG_ROW_CONFIG_TITLE' => $title, // Заголовок конфигурации
'ADMIN_CONFIG_ROW_CONFIG_MORE_URL' => cot_url( // Ссылка для сброса конфигурации
'admin',
[
'm' => 'config',
'n' => 'edit',
'o' => $o,
'p' => $p,
'a' => 'reset',
'v' => $row['config_name'],
]
),
'ADMIN_CONFIG_ROW_CONFIG_MORE' => $hint, // Подсказка для конфигурации
]);
/* === Hook - Part2 : Include === */ // Начало блока хуков для расширений в этой части
foreach ($extp as $pl) { // Проходим по всем расширениям, подключаемым к хуку 'admin.config.edit.loop'
include $pl; // Подключаем каждое расширение
}
/* ===== */ // Конец блока хуков
$t->parse('MAIN.EDIT.ADMIN_CONFIG_ROW.ADMIN_CONFIG_ROW_OPTION'); // Парсим текущий элемент конфигурации
}
$t->parse('MAIN.EDIT.ADMIN_CONFIG_ROW'); // Парсим строку элемента конфигурации
$prev_subcat = $row['config_subcat']; // Сохраняем предыдущую подкатегорию для следующей итерации
}
$t->assign([ // Присваиваем значения шаблону
'ADMIN_CONFIG_FORM_URL' => cot_url( // Генерируем URL для формы обновления конфигурации
'admin',
['m' => 'config', 'n' => 'edit', 'o' => $o, 'p' => $p, 'a' => 'update'] // Параметры URL для редактирования конфигурации
),
]);
/* === Hook === */ // Начало блока хуков для расширений в этой части
foreach (cot_getextplugins('admin.config.edit.tags') as $pl) { // Проходим по всем расширениям, подключаемым к хуку 'admin.config.edit.tags'
include $pl; // Подключаем каждое расширение
}
/* ===== */ // Конец блока хуков
$t->parse('MAIN.EDIT'); // Парсим основной блок шаблона для редактирования конфигурации
break; // Завершаем выполнение текущего блока switch
Этот код генерирует URL для формы редактирования конфигурации и обрабатывает хуки для расширений, позволяя подключать дополнительный функционал. В конце, парсится шаблон редактирования конфигурации.
default: // Дефолтный случай для обработки категории конфигураций
$adminPath[] = array(cot_url('admin', 'm=config'), $L['Configuration']); // Добавляем в путь администратора ссылку на раздел конфигурации
$sql = Cot::$db->query( // Выполняем запрос к базе данных для получения уникальных категорий конфигураций
'SELECT DISTINCT(config_cat) FROM ' . Cot::$db->quoteTableName(Cot::$db->config) . ' '
. "WHERE config_owner = 'core' AND config_type <> '" . COT_CONFIG_TYPE_HIDDEN . "' "
. 'ORDER BY config_cat ASC' // Условие запроса, исключающее скрытые конфигурации
);
$jj = 0; // Инициализация счётчика для номеров строк
while ($row = $sql->fetch()) { // Перебираем все категории конфигураций
$jj++; // Увеличиваем счётчик
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
/** @deprecated For backward compatibility. Will be removed in future releases */
$legacyIcon = ''; // Для совместимости с более старыми версиями (удалено в будущих версиях)
}
$icon = ''; // Инициализация переменной для иконки
$key = 'icon_cfg_'.$row['config_cat']; // Формируем ключ для иконки категории
if (!empty(Cot::$R[$key])) { // Проверяем, есть ли иконка в ресурсах
$icon = Cot::$R[$key]; // Если есть, присваиваем её переменной
} elseif (!empty(Cot::$R['icon_extension_default'])) { // Если нет, проверяем наличие иконки по умолчанию
$icon = Cot::$R['icon_extension_default']; // Присваиваем иконку по умолчанию
} else {
$fileName = Cot::$cfg['icons_dir'] . '/' . Cot::$cfg['defaulticons'] . '/cfg/' .
$row['config_cat'] . '.png'; // Формируем путь к иконке категории
if (file_exists($fileName)) { // Если файл существует, используем его как иконку
$icon = cot_rc('img_none', ['src' => $fileName]); // Вставляем изображение в шаблон
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$legacyIcon = $fileName; // Для старых версий сохраняем путь к иконке
}
}
}
if (empty($icon) && !empty($R['admin_icon_extension'])) { // Если иконки нет, используем иконку для расширений
$icon = $R['admin_icon_extension'];
}
if (empty($icon)) { // Если иконка всё ещё пуста, используем иконку по умолчанию
$fileName = Cot::$cfg['icons_dir'] . '/default/default.png';
if (file_exists($fileName)) { // Проверяем наличие файла иконки по умолчанию
$icon = cot_rc('img_none', ['src' => $fileName]); // Вставляем её в шаблон
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$legacyIcon = $fileName; // Для старых версий сохраняем путь к иконке
}
}
}
$t->assign([ // Присваиваем переменные шаблону
'ADMIN_CONFIG_ROW_URL' => cot_url('admin', 'm=config&n=edit&o=core&p=' . $row['config_cat']), // URL для редактирования категории конфигурации
'ADMIN_CONFIG_ROW_ICON' => $icon, // Иконка категории
'ADMIN_CONFIG_ROW_NAME' => isset(Cot::$L['core_' . $row['config_cat']]) ?
Cot::$L['core_' . $row['config_cat']] : $row['config_cat'], // Название категории конфигурации
'ADMIN_CONFIG_ROW_DESC' => isset(Cot::$L['core_' . $row['config_cat'] . '_desc']) ?
Cot::$L['core_' . $row['config_cat'] . '_desc'] : '', // Описание категории конфигурации
'ADMIN_CONFIG_ROW_NUM' => $jj, // Номер строки
//'ADMIN_CONFIG_ROW_ODDEVEN' => cot_build_oddeven($jj) // (закомментировано) Генерация чётности/нечётности для строки
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$t->assign([ // Для старых версий сохраняем путь к иконке
'ADMIN_CONFIG_ROW_ICO' => $legacyIcon,
]);
}
$t->parse('MAIN.DEFAULT.ADMIN_CONFIG_COL.ADMIN_CONFIG_ROW'); // Парсим строку конфигурации в шаблоне
}
$sql->closeCursor(); // Закрываем курсор после завершения работы с запросом
Этот участок кода генерирует таблицу конфигураций с иконками и ссылками на редактирование. Он проверяет наличие иконок для каждой категории конфигурации и, если нужно, использует иконки по умолчанию. Каждая строка таблицы конфигураций создаётся с использованием данных из базы и отображает название, описание и ссылку для редактирования.
$t->assign('ADMIN_CONFIG_COL_CAPTION', $L['Core']); // Присваиваем заголовок колонки "Core" для таблицы конфигурации
$t->parse('MAIN.DEFAULT.ADMIN_CONFIG_COL'); // Парсим строку таблицы с названием "Core"
$sql = $db->query(" // Выполняем запрос к базе данных для получения уникальных категорий конфигураций для модулей
SELECT DISTINCT(config_cat) FROM $db_config
WHERE config_owner = 'module'
AND config_type != '" . COT_CONFIG_TYPE_HIDDEN . "' // Исключаем скрытые конфигурации
ORDER BY config_cat ASC // Сортировка по категории конфигурации
");
$jj = 0; // Инициализация счётчика
while ($row = $sql->fetch()) { // Перебираем все категории конфигураций для модулей
$jj++; // Увеличиваем счётчик
$ext_info = cot_get_extensionparams($row['config_cat'], true); // Получаем информацию о расширении
$t->assign([ // Присваиваем значения для шаблона
'ADMIN_CONFIG_ROW_URL' => cot_url('admin', 'm=config&n=edit&o=module&p=' . $row['config_cat']), // URL для редактирования конфигурации модуля
'ADMIN_CONFIG_ROW_ICON' => $ext_info['icon'], // Иконка для модуля
'ADMIN_CONFIG_ROW_NAME' => $ext_info['name'], // Название модуля
'ADMIN_CONFIG_ROW_DESC' => $ext_info['desc'], // Описание модуля
'ADMIN_CONFIG_ROW_NUM' => $jj, // Номер строки
//'ADMIN_CONFIG_ROW_ODDEVEN' => cot_build_oddeven($jj) // (закомментировано) Генерация чётности/нечётности для строки
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$t->assign([ // Для старых версий сохраняем информацию о иконке модуля
'ADMIN_CONFIG_ROW_ICO' => $ext_info['legacyIcon'], // @deprecated Для совместимости, будет удалено в будущих версиях
]);
}
$t->parse('MAIN.DEFAULT.ADMIN_CONFIG_COL.ADMIN_CONFIG_ROW'); // Парсим строку конфигурации модуля
}
$sql->closeCursor(); // Закрываем курсор после выполнения запроса
Этот участок кода обрабатывает категории конфигураций для модулей. Он выполняет запрос к базе данных, чтобы получить все уникальные категории конфигураций для модулей, за исключением скрытых. Для каждой категории конфигурации модуля генерируется строка с ссылкой на редактирование, иконкой, названием, описанием и порядковым номером. Также предусмотрена совместимость для старых версий с использованием устаревших иконок.
$t->assign('ADMIN_CONFIG_COL_CAPTION', $L['Modules']); // Присваиваем заголовок колонки "Modules" для таблицы конфигурации
$t->parse('MAIN.DEFAULT.ADMIN_CONFIG_COL'); // Парсим строку таблицы с названием "Modules"
$sql = $db->query(" // Выполняем запрос к базе данных для получения уникальных категорий конфигураций для плагинов
SELECT DISTINCT(c.config_cat), r.ct_title FROM $db_config AS c
LEFT JOIN $db_core AS r ON c.config_cat = r.ct_code
WHERE config_owner = 'plug' // Фильтруем по плагинам
AND config_type != '" . COT_CONFIG_TYPE_HIDDEN . "' // Исключаем скрытые конфигурации
ORDER BY config_cat ASC // Сортировка по категории конфигурации
");
$jj = 0; // Инициализация счётчика
while ($row = $sql->fetch()) { // Перебираем все категории конфигураций для плагинов
$jj++; // Увеличиваем счётчик
$ext_info = cot_get_extensionparams($row['config_cat'], false); // Получаем информацию о расширении
$t->assign([ // Присваиваем значения для шаблона
'ADMIN_CONFIG_ROW_URL' => cot_url('admin', 'm=config&n=edit&o=plug&p=' . $row['config_cat']), // URL для редактирования конфигурации плагина
'ADMIN_CONFIG_ROW_ICON' => $ext_info['icon'], // Иконка для плагина
'ADMIN_CONFIG_ROW_NAME' => $ext_info['name'], // Название плагина
'ADMIN_CONFIG_ROW_DESC' => $ext_info['desc'], // Описание плагина
'ADMIN_CONFIG_ROW_NUM' => $jj, // Номер строки
//'ADMIN_CONFIG_ROW_ODDEVEN' => cot_build_oddeven($jj) // (закомментировано) Генерация чётности/нечётности для строки
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) {
$t->assign([ // Для старых версий сохраняем информацию о иконке плагина
'ADMIN_CONFIG_ROW_ICO' => $ext_info['legacyIcon'], // @deprecated Для совместимости, будет удалено в будущих версиях
]);
}
$t->parse('MAIN.DEFAULT.ADMIN_CONFIG_COL.ADMIN_CONFIG_ROW'); // Парсим строку конфигурации плагина
}
$sql->closeCursor(); // Закрываем курсор после выполнения запроса
$t->assign('ADMIN_CONFIG_COL_CAPTION', $L['Plugins']); // Присваиваем заголовок колонки "Plugins" для таблицы конфигурации
$t->parse('MAIN.DEFAULT.ADMIN_CONFIG_COL'); // Парсим строку таблицы с названием "Plugins"
/* === Hook === */
foreach (cot_getextplugins('admin.config.default.tags') as $pl) {
include $pl; // Включаем расширения для тегов
}
/* ===== */
$t->parse('MAIN.DEFAULT'); // Парсим главную часть для отображения
break; // Выход из блока переключателя (switch)
}
cot_display_messages($t); // Отображаем сообщения на основе шаблона
/* === Hook === */
foreach (cot_getextplugins('admin.config.tags') as $pl) {
include $pl; // Включаем расширения для тегов
}
/* ===== */
$t->parse('MAIN'); // Парсим шаблон страницы
$adminMain = $t->text('MAIN'); // Получаем страницу после парсинга
Этот код выполняет несколько операций для отображения конфигураций плагинов и модулей. Сначала он заполняет шаблон для колонок "Modules" и "Plugins" в административной панели, затем загружает соответствующие категории конфигураций для плагинов и модулей из базы данных, обрабатывая их с учётом информации о расширениях. К тому же, предусмотрены механизмы для работы в "legacy" (старых) режимах.
Также применяется механизм хуков для расширений, который позволяет добавлять функциональность на разных этапах обработки данных. В конце, после всего выполнения, выводятся сообщения и производится финальный рендеринг страницы.
Comments (0)
Content author
Offline
Administrator
Last logged: 2026-07-05 18:32
- Page published: 2025-01-28 15:51
- Last update: 2025-01-28 16:01