Файл admin.config.php в Cotonti CMF

Основное назначение файла и его место в системе

Файл admin.config.php является частью административной панели системы управления контентом Cotonti CMF. Он отвечает за управление конфигурациями сайта, предоставляя интерфейс для настройки различных параметров системы и её расширений через административную панель. Это важный компонент для работы с настройками как "ядерных" (основных) функций, так и для установки и настройки расширений (модулей и плагинов).

Файл является частью модуля "Конфигурация" и служит для:

  • Редактирования конфигурационных опций как для ядра системы, так и для отдельных расширений (модулей и плагинов).
  • Сохранения изменений конфигураций.
  • Обработки условий для разных типов конфигураций (например, для core, module, plug).
  • Выводит формы для редактирования настроек и обработки событий, таких как обновления конфигурации или сброс настроек.

Суть содержания кода и выполняемые задачи

  1. Авторизация и доступ:

    • Код проверяет, является ли текущий пользователь администратором, через функцию cot_auth(), и вызывает функцию cot_block(), чтобы запретить доступ пользователям без прав администратора.
  2. Подключение необходимых файлов:

    • Подключение файла configuration для работы с конфигурационными данными системы.
  3. Хуки:

    • Используется несколько хуков (cot_getextplugins()), что позволяет другим модулям или плагинам добавлять свою функциональность на разных этапах обработки конфигурации.
  4. Редактирование конфигурации:

    • Определены различные действия для редактирования конфигураций, такие как обновление или сброс настроек. Код выполняет проверку POST-запросов для сохранения изменений.
  5. Отображение конфигурационных данных:

    • Формируются данные для отображения в административной панели, включая категории конфигураций, иконки и описания для каждой категории настроек.
    • Выводятся различные формы с конфигурационными параметрами, которые могут быть обновлены или сброшены.
  6. Обработка расширений:

    • Для расширений (модулей и плагинов) извлекаются и отображаются данные о конфигурациях с возможностью редактирования для каждого расширения.
  7. Вывод сообщений:

    • В случае успешных или частичных обновлений отображаются сообщения об успешном обновлении конфигурации или ошибках.

Методы и функции, используемые в файле

  • 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

  1. Использование объектно-ориентированного подхода:

    • Хотя в коде присутствуют вызовы функций, работа с шаблонами (XTemplate), а также использование объектов и классов (например, Cot::$cache), код в целом остаётся процедурным.
  2. Модульность и расширяемость:

    • Активное использование хуков и плагинов для расширения функциональности. Внешние модули могут легко интегрироваться в административную панель через хуки cot_getextplugins().
  3. Безопасность:

    • Использование проверок типа defined('COT_CODE') && defined('COT_ADMIN') для защиты от прямого доступа к файлу.
  4. Управление сессиями и правами доступа:

    • В коде активно используется система прав и аутентификации пользователей с административными правами.
  5. Обработка данных и запросов:

    • Обработка пользовательских запросов с использованием глобальных переменных, таких как $_POST, с валидацией и фильтрацией данных через функции типа cot_import().
  6. Гибкость и настройки:

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

Заключение

Файл 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" (старых) режимах.

Также применяется механизм хуков для расширений, который позволяет добавлять функциональность на разных этапах обработки данных. В конце, после всего выполнения, выводятся сообщения и производится финальный рендеринг страницы.

 

 

 

15 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-28 15:51
  • Last update: 2025-01-28 16:01

Similar pages

Файл config.php в Cotonti CMF
1 Файл config.php в Cotonti CMF является одним из ключевых конфигурационных файлов системы. Он хранится в каталоге
Файл admin.cache.disk.php в Cotonti CMF
2 Файл admin.cache.disk.php в движке Cotonti CMF является частью административной панели, предназначенной для управления
Файл admin.extensions.php в Cotonti CMF
3 Файл "admin.extensions.php" в движке Cotonti CMF является важным компонентом административной части системы,
Файл admin.extrafields.php в Cotonti CMF
4 Файл admin.extrafields.php в движке Cotonti CMF предназначен для управления дополнительными полями (extra fields) в
Файл admin.functions.php в Cotonti CMF
5 Основное назначение файла admin.functions.php и его место в системе Файл admin.functions.php в системе Cotonti CMF