Файл admin.other.php в Cotonti CMF
Он взаимодействует с несколькими сервисами и классами для получения данных о расширениях, их сортировки и отображения в административной панели.
Основное назначение файла и его место в системе:
Файл admin.other.php в Cotonti CMF отвечает за отображение и управление страницами администрирования, которые связаны с плагинами и модулями. Это раздел админки, который позволяет администратору просматривать и управлять установленными расширениями (модулями и плагинами). Он выполняет задачи, связанные с:
- Загрузкой и отображением информации о модулях и плагинах.
- Созданием навигации по административной панели для этих расширений.
- Управлением доступом к этим разделам, в зависимости от прав пользователя.
Суть содержания кода и его задачи:
-
Проверка параметров: Если в URL задан параметр
p, код обрабатывает запрос для конкретного расширения. В противном случае код выводит список всех доступных расширений (модулей и плагинов). -
Авторизация: Для работы с плагинами или модулями выполняется проверка прав доступа с помощью функции
cot_auth(). Права доступа для чтения и записи определяются в зависимости от типа расширения. -
Получение информации о расширении: Для каждого расширения (плагина или модуля) выполняется извлечение информации, такой как имя, описание и иконка, которая затем используется для отображения в интерфейсе администратора.
-
Обработка "legacyMode": Если в конфигурации включен режим совместимости (legacy mode), код отображает старые иконки и другие элементы интерфейса для обеспечения совместимости с предыдущими версиями Cotonti.
-
Сортировка расширений: Расширения сортируются по коду для более удобного отображения в админке.
-
Отображение в шаблоне: Все собранные данные передаются в шаблон с использованием библиотеки
XTemplateдля дальнейшего отображения на странице администрирования. -
Подключение плагинов: В коде есть хуки, которые позволяют подключать дополнительные плагины для расширения функциональности страницы.
Методы и функции в файле:
-
cot_auth():
- Эта функция проверяет права доступа для пользователя, определяя, какие операции (чтение, запись и т.д.) разрешены для текущего расширения.
- Применяется для защиты от несанкционированного доступа.
-
cot_get_extensionparams():
- Получает параметры конкретного расширения, такие как его название, описание, иконка и другие данные.
- Используется для извлечения информации о модулях и плагинах для отображения в админке.
-
cot_getextplugins():
- Возвращает список плагинов, подключенных к данному разделу.
- Важно для расширяемости системы, поскольку позволяет подключать дополнительные плагины через хуки.
-
cot_url():
- Формирует URL-адрес для различных разделов админки, таких как страницы кэширования, структуры, логов и т.д.
- Используется для построения ссылок в навигации и в интерфейсе администратора.
-
usort():
- Функция PHP для сортировки массива. В данном контексте она используется для сортировки расширений по коду, чтобы они отображались в правильном порядке.
Взаимодействие с классами и объектами:
-
ExtensionsService:
- Класс
ExtensionsServiceиспользуется для получения списка установленных расширений (модулей и плагинов), а также для генерации URL-адресов административных страниц для этих расширений. - Он взаимодействует с файлом через методы, такие как
getModulesList(),getPluginsList(), иgetAdminPageUrl(), которые возвращают соответствующие данные и URL-адреса.
- Класс
-
Router:
- Класс
Routerиспользуется для обработки маршрутов администрирования. МетодrouteAdminOther()помогает маршрутизировать запросы к админке для различных расширений в зависимости от параметраp.
- Класс
-
XTemplate:
XTemplate— это шаблонизатор, используемый для генерации HTML-кода на основе переданных данных. Он используется для заполнения данных о расширениях в шаблон и отображения страницы админки.- Взаимодействие происходит через методы
assign(),parse()иout(), которые позволяют передавать данные и рендерить шаблон.
-
Legacy Mode:
- Режим совместимости (legacy mode) управляется через глобальную переменную конфигурации
Cot::$cfg['legacyMode']. В случае его активации, код использует старые элементы интерфейса для обеспечения совместимости с предыдущими версиями системы.
- Режим совместимости (legacy mode) управляется через глобальную переменную конфигурации
Стиль PHP:
-
Использование ООП: В коде активно используются классы и объекты, такие как
XTemplate,Router,ExtensionsService. Это характерно для современного подхода программирования в PHP, когда основное внимание уделяется организации кода в виде классов и методов. -
Использование глобальных переменных: Множество глобальных переменных используется для конфигурации и взаимодействия с системой, например,
Cot::$usrдля доступа к данным пользователя,Cot::$cfgдля конфигурации системы, и т.д. Это типично для Cotonti и других фреймворков, использующих глобальные состояния. -
Проверки и фильтрация данных: Использование функций типа
cot_import()для фильтрации и проверки входных данных также является важной частью стиля, обеспечивающей безопасность и надежность кода. -
Декларации хуков: Использование хуков, как например
cot_getextplugins()иcot_block(), демонстрирует приверженность принципам расширяемости и модульности, позволяя легко добавлять или изменять функциональность системы. -
Обработка ошибок и прав доступа: Весь код защищен от несанкционированного доступа и ошибок с помощью проверок прав пользователя, использования функции
cot_block()для блокировки доступа, если нет прав на выполнение определенных операций, и других механизмов безопасности.
Заключение:
Файл admin.other.php играет важную роль в администрировании расширений (модулей и плагинов) в Cotonti. Он взаимодействует с несколькими сервисами и классами для получения данных о расширениях, их сортировки и отображения в административной панели. Код написан с использованием современных PHP-технологий, таких как объектно-ориентированное программирование и хуки для расширяемости, а также учитывает обратную совместимость для старых версий системы.
находится по адресу: /system/admin/admin.other.php движка php-фреймворка Cotonti.
<?php
/**
* Administration panel - Other Admin parts listing
*
* @package Cotonti
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
use cot\extensions\ExtensionsDictionary; // Подключение класса ExtensionsDictionary для работы с расширениями
use cot\extensions\ExtensionsService; // Подключение класса ExtensionsService для управления расширениями
use cot\router\Router; // Подключение класса Router для маршрутизации запросов
(defined('COT_CODE') && defined('COT_ADMIN')) or die('Wrong URL.'); // Проверка, чтобы файл был вызван внутри системы, иначе завершение выполнения
$t = new XTemplate(cot_tplfile('admin.other', 'core')); // Создание объекта XTemplate для работы с шаблоном админ-страницы "other"
$p = cot_import('p', 'G', 'ALP'); // Импорт параметра 'p' из GET-запроса, значение которого будет использоваться для фильтрации или другой логики
/* === Hook === */
foreach (cot_getextplugins('admin.other.first') as $extension) { // Загружаются плагины, подключенные к хуку 'admin.other.first'
include $extension; // Включение каждого плагина
}
/* ===== */
Объяснение кода:
-
Использование классов:
- Подключаются классы для работы с расширениями (
ExtensionsDictionaryиExtensionsService), а также для маршрутизации запросов (Router).
- Подключаются классы для работы с расширениями (
-
Проверка безопасности:
- Проверяется, чтобы файл был загружен в контексте системы Cotonti с административными правами (
COT_ADMIN). Если это не так, выполнение прерывается.
- Проверяется, чтобы файл был загружен в контексте системы Cotonti с административными правами (
-
Работа с шаблоном:
- Создается объект шаблона
XTemplateс помощью функцииcot_tplfile, которая загружает шаблон для админки (файлadmin.other).
- Создается объект шаблона
-
Получение параметра из запроса:
- Из запроса GET извлекается параметр
p, который может быть использован для дальнейшей фильтрации или управления контентом страницы.
- Из запроса GET извлекается параметр
-
Использование хуков:
- Прокачка хука
admin.other.firstдля подключения сторонних плагинов, которые могут расширить функциональность на этом этапе.
- Прокачка хука
Этот участок кода отвечает за подготовку страницы с другими административными частями и подключение всех плагинов, которые должны быть загружены на этом этапе.
if (!empty($p)) { // Проверка, не пуст ли параметр 'p', который был передан через GET-запрос
$route = Router::getInstance()->routeAdminOther($p); // Получение маршрута для администрирования плагина, если параметр 'p' задан
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('plug', $p); // Получение прав доступа для плагина, указанных в параметре 'p'
cot_block(Cot::$usr['isadmin']); // Блокировка доступа, если у пользователя нет административных прав
if (file_exists(cot_langfile($p, ExtensionsDictionary::TYPE_PLUGIN))) { // Проверка, существует ли файл языковой локализации плагина
require_once cot_langfile($p, ExtensionsDictionary::TYPE_PLUGIN); // Подключение файла локализации плагина, если он существует
}
$extInfo = cot_get_extensionparams($p, false); // Получение параметров плагина с кодом $p
$adminTitle = $extInfo['name']; // Название плагина из параметров
$adminPath = [ // Формирование пути навигации для админки
[cot_url('admin', ['m' => 'extensions']), Cot::$L['Extensions']], // Ссылка на раздел расширений
[cot_url('admin', ['m' => 'extensions', 'a' => 'details', 'pl' => $p]), $adminTitle], // Ссылка на подробности плагина
[cot_url('admin', ['m' => 'other', 'p' => $p]), Cot::$L['Administration']], // Ссылка на текущую страницу администрирования плагина
];
$adminMain = ''; // Инициализация переменной для основного контента страницы
$legacyMode = isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']; // Проверка на включение режима совместимости (legacy mode)
if (!empty($route->includeFiles)) { // Если маршрутом предусмотрено подключение дополнительных файлов
foreach ($route->includeFiles as $includeFile) { // Для каждого включаемого файла
if ($legacyMode) { // Если включен режим совместимости
/** @deprecated in 0.9.25 */
$plugin_body = ''; // Объявление переменной для старого контента плагина (deprecated)
}
$pluginBody = ''; // Инициализация переменной для содержимого плагина
include_once $includeFile; // Включение файла плагина
$adminMain .= $pluginBody; // Добавление содержимого плагина в основной контент страницы
if ($legacyMode) { // Если включен режим совместимости
// @deprecated in 0.9.25
$adminMain .= $plugin_body; // Добавление старого контента плагина (deprecated)
}
}
} elseif ($route->controller !== null && $route->action !== null) { // Если у маршрута есть контроллер и действие
$adminMain = $route->controller->runAction($route->action); // Выполнение действия контроллера и получение результата
}
unset($route); // Очистка переменной маршрута
} else { // Если параметр 'p' пустой
Объяснение кода:
-
Работа с плагинами:
- Проверяется, задан ли параметр
p, который идентифицирует плагин. - Получается маршрут для работы с плагином с помощью
Router::getInstance()->routeAdminOther($p).
- Проверяется, задан ли параметр
-
Проверка прав доступа:
- В зависимости от параметра
pосуществляется проверка прав пользователя с помощьюcot_authи блокировка доступа для пользователей, не имеющих прав администратора.
- В зависимости от параметра
-
Работа с языковыми файлами:
- Если для плагина существует файл локализации, он подключается с помощью
cot_langfile.
- Если для плагина существует файл локализации, он подключается с помощью
-
Маршруты и навигация:
- Формируется путь навигации в админке с помощью массива
$adminPath, включая ссылки на разделы расширений и подробности плагина.
- Формируется путь навигации в админке с помощью массива
-
Работа с включаемыми файлами:
- Если маршрут плагина предусматривает подключение файлов, они подключаются в цикле, и содержимое каждого плагина добавляется в основной контент страницы.
-
Режим совместимости (legacy mode):
- Есть проверка на наличие режима совместимости, и если он активирован, включается поддержка старых механизмов работы с плагинами.
Этот участок кода управляет загрузкой плагинов для административной панели, проверяет права доступа, подключает файлы локализации и формирует основной контент для отображения в админке.
} else { // Если параметр 'p' пустой, то продолжаем выполнение
$adminPath[] = [cot_url('admin', ['m' => 'other']), Cot::$L['Other']]; // Добавляем пункт навигации "Other" в путь
$adminTitle = Cot::$L['Other']; // Название страницы администрирования
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('admin', 'a'); // Проверка прав доступа для администрирования
cot_block(Cot::$usr['auth_read']); // Блокировка доступа, если нет прав на чтение
$target = []; // Инициализация пустого массива для целевого контента
$extensionsService = ExtensionsService::getInstance(); // Получение экземпляра службы расширений
foreach ([ExtensionsDictionary::TYPE_MODULE, ExtensionsDictionary::TYPE_PLUGIN] as $type) { // Перебор типов расширений: модули и плагины
if ($type === ExtensionsDictionary::TYPE_MODULE) { // Если тип - модуль
$list = $extensionsService->getModulesList(); // Получение списка модулей
$title = Cot::$L['Modules']; // Название раздела - "Modules"
} else { // Если тип - плагин
$list = $extensionsService->getPluginsList(); // Получение списка плагинов
$title = Cot::$L['Plugins']; // Название раздела - "Plugins"
}
if (!empty($list) && is_array($list)) { // Если список расширений не пустой и является массивом
usort(
$list,
function (array $a, array $b): int { // Сортировка списка расширений по коду
if ($a['code'] === $b['code']) { // Если коды одинаковые
return 0;
}
return ($a['code'] < $b['code']) ? -1 : 1; // Сравнение кодов
}
);
foreach ($list as $extension) { // Перебор каждого расширения
$adminPartUrl = $extensionsService->getAdminPageUrl($extension['code'], $type); // Получение URL для страницы администрирования плагина или модуля
if (empty($adminPartUrl)) { // Если URL пустой, пропустить
continue;
}
$extensionInfo = cot_get_extensionparams(
$extension['code'], $type === ExtensionsDictionary::TYPE_MODULE
); // Получение информации о расширении
$t->assign([
'ADMIN_OTHER_EXT_URL' => $adminPartUrl, // Ссылка на админ-страницу расширения
'ADMIN_OTHER_EXT_ICON' => $extensionInfo['icon'], // Иконка расширения
'ADMIN_OTHER_EXT_NAME' => $extensionInfo['name'], // Название расширения
'ADMIN_OTHER_EXT_DESC' => $extensionInfo['desc'], // Описание расширения
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
$t->assign([
// @deprecated Для обратной совместимости. Будет удалено в будущих версиях
'ADMIN_OTHER_EXT_ICO' => $extensionInfo['legacyIcon'], // Используется старая иконка
]);
}
$t->parse('MAIN.SECTION.ROW'); // Парсинг строки для расширения
}
} else { // Если список пуст, парсим пустую строку
$t->parse('MAIN.SECTION.EMPTY');
}
$t->assign('ADMIN_OTHER_SECTION', $title); // Присваиваем название раздела (Модули или Плагины)
$t->parse('MAIN.SECTION'); // Парсинг секции
}
$t->assign([ // Присваиваем URL для других разделов админки
'ADMIN_OTHER_URL_CACHE' => cot_url('admin', 'm=cache'),
'ADMIN_OTHER_URL_DISKCACHE' => cot_url('admin', 'm=cache&s=disk'),
'ADMIN_OTHER_URL_EXFLDS' => cot_url('admin', 'm=extrafields'),
'ADMIN_OTHER_URL_STRUCTURE' => cot_url('admin', 'm=structure'),
'ADMIN_OTHER_URL_LOG' => cot_url('admin', 'm=log'),
'ADMIN_OTHER_URL_INFOS' => cot_url('admin', 'm=infos'),
'ADMIN_OTHER_URL_PHPINFO' => cot_url('admin', 'm=phpinfo'),
]);
/* === Hook === */
foreach (cot_getextplugins('admin.other.tags') as $extension) { // Включаем дополнительные теги из плагинов
include $extension;
}
/* ===== */
$t->parse('MAIN'); // Парсинг главного шаблона
$adminMain = $t->text('MAIN'); // Получение содержимого главного шаблона
}
Объяснение кода:
-
Работа с типами расширений:
- Если параметр
pне задан, код переходит к отображению других разделов админки, таких как модули и плагины. - Для каждого типа расширения (
moduleиplugin) происходит получение соответствующего списка с помощьюgetModulesListиgetPluginsList.
- Если параметр
-
Обработка расширений:
- Для каждого расширения (модуль или плагин) проверяется наличие страницы администрирования, а также собирается информация о расширении, такая как иконка, название и описание.
- Эти данные передаются в шаблон для дальнейшего отображения в админке.
-
Режим совместимости (legacy mode):
- В случае включения режима совместимости добавляется поддержка старых иконок для расширений.
-
Навигация и ссылки:
- В коде формируется навигация для разных разделов админки и присваиваются ссылки на страницы кэширования, структуры, логов и другие административные инструменты.
-
Подключение плагинов:
- Используются хуки для подключения дополнительных плагинов, которые могут добавлять свои теги или функционал на страницу.
Этот участок кода управляет отображением различных разделов администрирования для модулей и плагинов в админке Cotonti, а также обеспечивают поддержку старых механизмов работы с расширениями в режиме совместимости.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 18:36
- Последнее обновление: 28.01.2025 18:36