Файл Router.php в Cotonti
Файл Router.php в движке Cotonti CMF (Content Management Framework) является частью системы маршрутизации, которая отвечает за обработку запросов, определение нужного контроллера и его действия в зависимости от параметров запроса. Этот файл играет ключевую роль в управлении тем, какой модуль, плагин или стандартная часть системы будет обрабатывать запросы в публичной и административной части сайта.
Основное назначение файла:
Файл Router.php отвечает за маршрутизацию запросов на сервере в зависимости от данных, переданных через URL-параметры (например, m, n, a, e, p и т. д.). В зависимости от этих параметров, система определяет:
- Тип расширения (модуль или плагин).
- Контроллер и действие для обработки запроса.
- Загружается соответствующий контроллер и выполняется нужное действие.
В случае, если не удается найти подходящий контроллер или действие, возбуждается исключение NotFoundHttpException.
Место в системе:
Файл Router.php является важной частью системы обработки запросов в движке Cotonti. Он работает с другими компонентами фреймворка, такими как:
- Контроллеры: Определяет, какой контроллер и его метод (действие) должны быть выполнены.
- Расширения (Extensions): Определяет, какой тип расширения (модуль или плагин) должен быть активирован для обработки запроса.
- Обработка URL: Перехватывает URL-запросы и преобразует их в внутренние команды для выполнения.
Этот файл предоставляет основной механизм для работы с запросами как для публичной части сайта (Frontend), так и для административной панели (Admin).
Суть содержания кода:
-
Основной метод маршрутизации - метод
route(), который выполняет основную маршрутизацию для публичной части сайта, обрабатывает параметры запроса, такие как код расширения, контроллер и действие, и возвращает соответствующий маршрут. -
Маршрутизация для административной части - метод
routeAdmin(), который обрабатывает маршруты для админки сайта. Он включает в себя специфические проверки и логику для обработки запросов, связанных с администрированием. -
Дополнительные методы для обработки расширений и включаемых файлов - методы, которые обрабатывают подключаемые файлы расширений для фронтенда и админки, а также обеспечивают поддержку для плагинов и модулей.
-
Обработка контроллеров и действий - методы
processController()иgetControllerClass()позволяют определять, какой контроллер и его действие нужно загрузить для обработки запроса.
Список классов в файле:
- Router - основной класс маршрутизатора, который управляет процессом маршрутизации запросов в системе Cotonti.
Список методов и функций в файле:
- route() — основной метод маршрутизации для публичной части сайта.
- routeAdmin() — маршрутизация для административной части сайта.
- routeAdminOther() — маршрутизация для других разделов админки.
- processController() — обработка контроллера, определение действия и загрузка соответствующего контроллера.
- getController() — получение контроллера по его ID.
- getControllerClass() — получение имени класса контроллера.
- getActionName() — получение имени действия в контроллере.
- processFrontIncludeFiles() — обработка файлов расширений для включения в публичной части.
- processAdminCoreIncludeFiles() — обработка файлов ядра для админки.
- processAdminExtensionIncludeFiles() — обработка файлов расширений для админки.
- prepareName() — подготовка имени контроллера или действия для соответствия стандартам.
Итог:
Файл Router.php в Cotonti CMF играет центральную роль в управлении запросами от пользователей, направляя их к соответствующим контроллерам и действиям. Это важная часть фреймворка, которая реализует функциональность маршрутизации и обработки запросов в публичной и административной части сайта, а также поддерживает систему расширений (модулей и плагинов).
Router.php в Cotonti CMF, который находится по адресу: /system/router/Router.php
declare(strict_types=1); // Включает строгую типизацию для этого файла. Это означает, что все типы данных, передаваемые в функции и методы, должны строго соответствовать ожидаемым типам. namespace cot\router; // Определяет пространство имен (namespace), в котором находится данный класс. Это помогает избежать конфликтов имен классов в других частях системы. use Cot; // Подключение класса Cot, который, вероятно, является центральным классом системы и предоставляет доступ к основным функциям и объектам. use cot\controllers\BaseController; // Подключение базового контроллера, который, возможно, используется для создания контроллеров для различных маршрутов. use cot\exceptions\NotFoundHttpException; // Подключение исключения для обработки ситуации, когда запрашиваемый маршрут или ресурс не найден. use cot\extensions\ExtensionsDictionary; // Подключение словаря расширений, вероятно, используется для управления расширениями в системе. use cot\extensions\ExtensionsService; // Подключение сервиса для работы с расширениями, возможно, для активации или деактивации расширений. use cot\traits\GetInstanceTrait; // Подключение трейта, который может предоставлять метод для получения единственного экземпляра класса (паттерн Singleton).
class Router // Объявление класса Router, который отвечает за маршрутизацию в системе.
{
use GetInstanceTrait; // Использование трейта GetInstanceTrait для предоставления метода получения единственного экземпляра класса (Singleton).
/**
* Routing for site's public area (front-end)
* Метод маршрутизации для публичной части сайта (frontend).
*/
public function route(): ?Route // Основной метод маршрутизации, который возвращает объект Route или null.
{
$extensionCode = isset($_GET['e']) ? cot_import('e', 'G', 'ALP') : null;
// Проверка наличия параметра 'e' в URL и его обработка, получение кода расширения (если параметр присутствует).
if ($extensionCode === 'admin') {
// Если код расширения равен 'admin', выбрасываем исключение NotFoundHttpException (страница не найдена).
throw new NotFoundHttpException();
}
$ajax = cot_import('r', 'G', 'ALP'); // Получение параметра 'r' из URL (для AJAX-запросов).
$popup = cot_import('o', 'G', 'ALP'); // Получение параметра 'o' из URL (для всплывающих окон).
if (!$extensionCode) {
// Если код расширения не был передан, пытаемся использовать параметры для AJAX или popup.
if (!empty($ajax)) {
$extensionCode = $ajax; // Если параметр 'r' существует, используем его как код расширения.
} elseif (!empty($popup)) {
$extensionCode = $popup; // Если параметр 'o' существует, используем его как код расширения.
}
}
$n = cot_import('n', 'G', 'ALP', 24); // Получаем параметр 'n' из URL (предположительно для контроллера).
$a = cot_import('a', 'G', 'ALP', 24); // Получаем параметр 'a' из URL (предположительно для действия контроллера).
if ($extensionCode === null) {
// Если код расширения всё ещё не определён.
if ($n !== null || $a !== null) {
// Если есть параметры для контроллера или действия.
$route = $this->processController(null, $n, $a, null);
// Обрабатываем маршрут для контроллера с параметрами 'n' и 'a'.
if ($route) {
return $route; // Если маршрут найден, возвращаем его.
}
}
/**
* Если запрос не содержит кода расширения, id контроллера или действия, выполняется модуль "index".
*/
$extensionCode = 'index'; // Устанавливаем "index" как код расширения по умолчанию.
}
if (!preg_match('`^\w+$`', $extensionCode)) {
// Проверка, чтобы код расширения содержал только буквы, цифры и подчеркивания (проверка на валидность).
// @todo error message ? Возможно, нужно добавить сообщение об ошибке.
throw new NotFoundHttpException(); // Если код расширения невалиден, выбрасываем исключение.
}
$extensionType = ExtensionsService::getInstance()->getType($extensionCode);
// Получаем тип расширения (модуль или плагин) с помощью сервиса расширений.
if ($extensionType === null) {
// Если тип расширения не найден.
throw new NotFoundHttpException(); // Выбрасываем исключение, так как расширение не найдено.
}
// Обработка маршрута для контроллера расширения.
$route = $this->processController($extensionCode, $n, $a, $extensionType);
if ($route === null) {
// Если контроллер не найден, пробуем обработать включаемые файлы расширения.
$route = $this->processFrontIncludeFiles(
$extensionCode,
$extensionType,
$ajax !== null,
$popup !== null
);
}
if ($route === null) {
// Если маршрут всё ещё не найден, выбрасываем исключение.
throw new NotFoundHttpException();
}
Cot::$env['ext'] = $extensionCode;
// Устанавливаем переменную окружения для текущего расширения.
Cot::$env['type'] = $extensionType;
// Устанавливаем переменную окружения для типа расширения.
if ($extensionType === ExtensionsDictionary::TYPE_MODULE) {
// Если тип расширения — модуль.
Cot::$env['location'] = $extensionCode;
// Устанавливаем переменную окружения для местоположения модуля.
define('COT_MODULE', true);
// Определяем константу для модуля.
} elseif ($extensionType === ExtensionsDictionary::TYPE_PLUGIN) {
// Если тип расширения — плагин.
Cot::$env['location'] = 'plugins';
// Устанавливаем переменную окружения для местоположения плагинов.
define('COT_PLUG', true);
// Определяем константу для плагина.
}
return $route;
// Возвращаем найденный маршрут.
}
public function routeAdmin(): ?Route // Метод маршрутизации для административной части сайта (backend).
{
$extensionCode = cot_import('m', 'G', 'ALP', 24);
// Получаем параметр 'm' из URL (код расширения для админки).
$requestControllerId = cot_import('n', 'G', 'ALP', 24);
// Получаем параметр 'n' из URL (ID контроллера).
$requestActionId = cot_import('a', 'G', 'ALP', 24);
// Получаем параметр 'a' из URL (ID действия контроллера).
$subPart = cot_import('s', 'G', 'ALP', 24);
// Получаем параметр 's' из URL (подраздел, возможно для выбора вкладки или дополнительной информации).
// Стандартные включаемые файлы для админки
$route = $this->processAdminCoreIncludeFiles($extensionCode, $subPart, $requestControllerId, $requestActionId);
// Обрабатываем включаемые файлы ядра для административной части.
if ($route !== null) {
return $route; // Если маршрут найден, возвращаем его.
}
// Ядро контроллеров
if ($extensionCode === null) {
// Если код расширения не передан, обрабатываем запрос для ядра.
return $this->processController(null, $requestControllerId, $requestActionId, null, true);
// Обрабатываем контроллер с параметрами для административной части.
}
$extensionType = ExtensionsService::getInstance()->getType($extensionCode);
// Получаем тип расширения (модуль или плагин) с помощью сервиса расширений.
if ($extensionType === null) {
// Если тип расширения не найден.
throw new NotFoundHttpException();
// Выбрасываем исключение, так как расширение не найдено.
}
// Контроллер модуля
$route = $this->processController(
$extensionCode,
$requestControllerId,
$requestActionId,
$extensionType,
true
);
// Обрабатываем маршрут для контроллера модуля.
if ($route === null) {
// Если маршрут не найден, пробуем обработать включаемые файлы для расширения.
$route = $this->processAdminExtensionIncludeFiles($extensionCode, $extensionType, 'admin');
}
if ($route === null) {
// Если маршрут всё ещё не найден, выбрасываем исключение.
throw new NotFoundHttpException();
}
Cot::$env['ext'] = $extensionCode;
// Устанавливаем переменную окружения для текущего расширения.
Cot::$env['type'] = $extensionType;
// Устанавливаем переменную окружения для типа расширения.
return $route;
// Возвращаем найденный маршрут.
}
/**
* Route for "admin.other" admin part (https://domain.tld/admin.php?m=other)
* Plugins only
*/
public function routeAdminOther(?string $extensionCode): Route // Метод маршрутизации для части админки "admin.other" (работает только для плагинов).
{
if ($extensionCode === null) {
// Если код расширения не передан в параметре функции, то пытаемся получить его из параметра URL 'p'.
$extensionCode = cot_import('p', 'G', 'ALP', 24);
}
if ($extensionCode === null) {
// Если код расширения так и не получен, выбрасываем исключение.
throw new NotFoundHttpException();
}
$extensionType = ExtensionsDictionary::TYPE_PLUGIN;
// Устанавливаем тип расширения как плагин.
$requestControllerId = cot_import('n', 'G', 'ALP', 24);
// Получаем ID контроллера из параметра URL 'n'.
$requestActionId = cot_import('a', 'G', 'ALP', 24);
// Получаем ID действия контроллера из параметра URL 'a'.
$route = $this->processController( // Вызываем метод processController для обработки маршрута с параметрами
$extensionCode, // Код расширения (например, название плагина)
$requestControllerId, // Идентификатор контроллера, полученный из URL параметра 'n'
$requestActionId, // Идентификатор действия, полученный из URL параметра 'a'
$extensionType, // Тип расширения (в данном случае тип плагина)
true // Параметр, возможно, указывающий, что это административная часть или дополнительная информация для обработки маршрута
);
// Обрабатываем маршрут для контроллера расширения (плагина) с переданными параметрами.
if ($route === null) {
// Если маршрут не найден, пробуем обработать включаемые файлы для административной части плагина.
$route = $this->processAdminExtensionIncludeFiles($extensionCode, $extensionType, 'tools');
}
if ($route === null) {
// Если маршрут всё ещё не найден, выбрасываем исключение.
throw new NotFoundHttpException();
}
Cot::$env['ext'] = $extensionCode;
// Устанавливаем переменную окружения для текущего расширения.
Cot::$env['type'] = $extensionType;
// Устанавливаем переменную окружения для типа расширения.
return $route;
// Возвращаем найденный маршрут.
}
/**
* @throws NotFoundHttpException // Выбрасывает исключение NotFoundHttpException
*/
private function processController( // Метод для обработки маршрута контроллера
?string $extensionCode, // Код расширения (плагина) или модуля
?string $requestControllerId, // Идентификатор контроллера из GET параметра 'n'
?string $requestActionId, // Идентификатор действия из GET параметра 'a'
?string $extensionType, // Тип расширения (плагина или модуля)
?bool $isAdmin = false // Флаг, указывающий, является ли запрос административной частью
): ?Route { // Возвращает объект Route или null, если маршрут не найден
$controllerId = $requestControllerId; // Присваиваем $controllerId значение из GET параметра 'n'
if ($controllerId === null) { // Если контроллер не задан
if ($extensionCode !== null) { // Если задан код расширения (например, плагина)
// Расширения могут иметь контроллер по умолчанию, например, IndexController
$controllerId = ExtensionsDictionary::DEFAULT_CONTROLLER_ID; // Устанавливаем контроллер по умолчанию для расширения
} elseif (!$isAdmin) { // Если не административная часть
// Основная часть сайта имеет контроллер по умолчанию MainController
$controllerId = 'main'; // Устанавливаем контроллер по умолчанию для основного сайта
}
}
if ($controllerId === null) { // Если контроллер не найден
return null; // Возвращаем null
}
$controller = $this->getController($controllerId, $extensionCode, $extensionType, $isAdmin); // Получаем контроллер по id
if ($controller === null) { // Если контроллер не найден
if ($isAdmin && (empty($extensionCode) || $extensionCode === ExtensionsDictionary::TYPE_CORE)) { // Если это административная часть и расширение не задано или это ядро
$controllerClass = $this->getControllerClass( // Получаем имя класса контроллера
$controllerId,
$extensionCode,
$extensionType,
$isAdmin,
false
);
throw new NotFoundHttpException('Controller "' . $controllerClass . '" not found"'); // Вызываем исключение, если контроллер не найден
}
return null; // Возвращаем null, если контроллер не найден
}
$actionId = $this->getActionName($requestActionId, get_class($controller)); // Получаем имя действия из запроса
if ($actionId === null) { // Если действие не найдено
if ($extensionCode === null && $requestControllerId === null && !$isAdmin) { // Если не задано расширение и контроллер, и это не админская часть
return null; // Возвращаем null
}
$actionName = $requestActionId; // Присваиваем имя действия из GET параметра 'a'
if (empty($actionName) && !empty($controller::$defaultAction)) { // Если имя действия пустое и есть значение по умолчанию для действия в контроллере
$actionName = $controller::$defaultAction; // Устанавливаем действие по умолчанию
}
throw new NotFoundHttpException( // Если действие не найдено, выбрасываем исключение
'Action "' . $actionName . '" not found in controller "'
. get_class($controller) . '"'
);
}
$route = new Route(); // Создаем новый объект Route
$route->extensionCode = $extensionCode; // Устанавливаем код расширения
$route->extensionType = $extensionType; // Устанавливаем тип расширения
$route->controller = $controller; // Устанавливаем контроллер
$route->action = $actionId; // Устанавливаем действие
return $route; // Возвращаем объект Route
}
/**
* @param string $controllerId Идентификатор контроллера
* @param ?string $extensionCode Код расширения (модуля или плагина), или NULL для ядра
* @param ?string $extensionType Тип расширения: ExtensionsDictionary::TYPE_MODULE или ExtensionsDictionary::TYPE_PLUGIN,
* NULL для ядра
*/
public function getController( // Метод для получения контроллера по его идентификатору
string $controllerId, // Идентификатор контроллера
?string $extensionCode = null, // Код расширения (необязателен)
?string $extensionType = null, // Тип расширения (необязателен)
?bool $isAdmin = false // Флаг для указания, что это административная часть (по умолчанию false)
): ?BaseController { // Возвращает экземпляр контроллера или null, если не найден
$className = $this->getControllerClass($controllerId, $extensionCode, $extensionType, $isAdmin); // Получаем имя класса контроллера
if ($className === null) { // Если класс контроллера не найден
return null; // Возвращаем null
}
$controller = new $className(); // Создаем экземпляр контроллера по имени класса
if (!($controller instanceof BaseController)) { // Проверяем, является ли контроллер экземпляром BaseController
return null; // Если нет, возвращаем null
}
return $controller; // Возвращаем созданный контроллер
}
В этом фрагменте кода происходит получение контроллера по идентификатору, расширению и типу расширения. Если контроллер не найден или не соответствует типу BaseController, возвращается null.
/**
* @param string $controllerId Идентификатор контроллера
* @param ?string $extensionCode Код расширения (модуля или плагина), или NULL для ядра
* @param ?string $extensionType Тип расширения: ExtensionsDictionary::TYPE_MODULE или ExtensionsDictionary::TYPE_PLUGIN,
* NULL для ядра
* @param bool $ifExists Проверка на существование класса
* @return ($ifExists is true ? ?class-string<BaseController> : class-string<BaseController>) Имя класса контроллера.
*/
public function getControllerClass( // Метод для получения имени класса контроллера
string $controllerId, // Идентификатор контроллера
?string $extensionCode = null, // Код расширения (необязателен)
?string $extensionType = null, // Тип расширения (необязателен)
?bool $isAdmin = false, // Флаг для административной части (по умолчанию false)
bool $ifExists = true // Флаг для проверки существования класса (по умолчанию true)
): ?string { // Возвращает имя класса контроллера или null, если класс не существует
$result = '\\cot\\'; // Инициализируем строку с пространством имен, начинаем с корня пространства имен
if ($extensionCode !== null) { // Если задан код расширения
if ($extensionType === ExtensionsDictionary::TYPE_PLUGIN) { // Если тип расширения - плагин
$result .= 'plugins'. '\\'; // Добавляем папку плагинов в путь
} elseif ($extensionType === ExtensionsDictionary::TYPE_MODULE) { // Если тип расширения - модуль
$result .= 'modules'. '\\'; // Добавляем папку модулей в путь
}
$result .= $extensionCode . '\\'; // Добавляем код расширения в путь
} elseif ($isAdmin) { // Если это административная часть
$result .= 'admin'. '\\'; // Добавляем папку админки в путь
}
$result .= 'controllers\\'; // Добавляем папку контроллеров в путь
if ($extensionCode !== null && $isAdmin) { // Если задан код расширения и это админская часть
$result .= 'admin'. '\\'; // Добавляем папку для админских контроллеров
}
$result .= $this->prepareName($controllerId) . 'Controller'; // Формируем имя класса контроллера, используя подготовленное имя
if ($ifExists) { // Если нужно проверить существование класса
return class_exists($result) ? $result : null; // Если класс существует, возвращаем его имя, иначе null
}
return $result; // Возвращаем имя класса контроллера
}
В данном фрагменте кода строится путь для класса контроллера в зависимости от параметров расширения, административной части, а также проверяется существование класса контроллера. Если флаг $ifExists установлен в true, то метод проверяет существование класса через class_exists.
/**
* @param class-string<BaseController> $controller Класс контроллера
*/
public function getActionName(?string $action, string $controller): ?string // Метод для получения имени действия в контроллере
{
if ($action !== null) { // Если передано имя действия
$actionName = 'action' . $this->prepareName($action); // Преобразуем имя действия в формат "actionActionName"
if (method_exists($controller, $actionName)) { // Если метод с таким именем существует в контроллере
return $action; // Возвращаем имя действия
}
$actions = $controller::actions(); // Получаем список доступных действий для контроллера
if (array_key_exists($action, $actions)) { // Если действие существует в списке доступных действий
return $action; // Возвращаем имя действия
}
return null; // Если действия не существует, возвращаем null
}
if (!empty($controller::$defaultAction)) { // Если контроллер имеет действие по умолчанию
return $this->getActionName($controller::$defaultAction, $controller); // Рекурсивно ищем действие по умолчанию
}
return null; // Если нет действия по умолчанию, возвращаем null
}
Этот метод проверяет, существует ли переданное действие в контроллере. Если действие не найдено, метод также проверяет, есть ли действие по умолчанию, и если оно есть, ищет его
private function processFrontIncludeFiles( // Метод для обработки файлов, которые включаются на фронтенде
string $extensionCode, // Код расширения (например, модуль или плагин)
string $extensionType, // Тип расширения (модуль или плагин)
bool $isAjax, // Флаг для определения, является ли запрос AJAX-запросом
bool $isPopup // Флаг для определения, является ли запрос всплывающим окном
): ?Route // Возвращает объект Route или null, если файлов для включения нет
{
if ($isPopup) { // Если запрос является всплывающим окном
$hook = 'popup'; // Устанавливаем хук для обработки всплывающих окон
} elseif ($isAjax) { // Если запрос является AJAX-запросом
$hook = 'ajax'; // Устанавливаем хук для обработки AJAX-запросов
} else { // Если запрос не является AJAX или всплывающим окном
$hook = $extensionType === ExtensionsDictionary::TYPE_MODULE ? 'module' : 'standalone'; // Если это модуль, то используем хук 'module', иначе 'standalone'
}
$route = new Route(); // Создаем новый объект маршрута
$route->extensionCode = $extensionCode; // Устанавливаем код расширения в маршруте
$route->extensionType = $extensionType; // Устанавливаем тип расширения в маршруте
$route->includeFiles = cot_getextplugins($hook, true, $extensionCode, $extensionType); // Получаем список файлов для включения, соответствующих хукe и расширению
if ($route->includeFiles === []) { // Если список файлов пуст
return null; // Возвращаем null, так как нет файлов для включения
}
return $route; // Возвращаем объект маршрута с включенными файлами
}
Этот метод обрабатывает файлы для включения на фронтенде в зависимости от типа запроса (AJAX, всплывающее окно или обычный запрос). Он устанавливает хук для соответствующего типа запроса и получает соответствующие файлы расширения для включения. Если файлы найдены, они добавляются в объект маршрута, который затем возвращается.
private function processAdminCoreIncludeFiles( // Метод для обработки стандартных файлов для включения в админской части
?string $adminPart, // $_GET['m'] - часть URL для админской страницы
?string $subPart, // $_GET['a'] - подчасть URL для дополнительных параметров
?string $requestControllerId, // $_GET['n'] - идентификатор контроллера в запросе
?string $requestActionId // $_GET['a'] - идентификатор действия в запросе
): ?Route // Возвращает объект Route с файлом для включения или null, если файлы не найдены
{
$standardAdmin = [ // Массив стандартных админских файлов, которые могут быть включены
'cache.disk', // Пример стандартных файлов для админки
'cache',
'config',
'extrafields',
'extensions',
'home',
'infos',
'log',
'other',
'phpinfo',
'rights',
'rightsbyitem',
'structure',
'urls',
'users',
];
$includeFile = null; // Переменная для хранения имени файла, который нужно подключить
if ($adminPart !== null) { // Если параметр $adminPart (часть URL для админки) не равен null
$includeFile = $adminPart; // Устанавливаем имя файла равным значению параметра $adminPart
//} elseif ($requestControllerId === null && $requestActionId === null) { // Этот блок закомментирован, ранее он проверял отсутствие контроллера и действия
} elseif ($requestControllerId === null) { // Если параметр $requestControllerId (идентификатор контроллера) равен null
// If the controller ID is not present in the request, it is the admin home page
$includeFile = 'home'; // В этом случае устанавливаем файл 'home' для домашней страницы админки
}
if ($includeFile === null) { // Если имя файла так и не было установлено
return null; // Возвращаем null, потому что нет файла для включения
}
if (!empty($subPart)) { // Если есть подчасть (дополнительный параметр $subPart)
$includeFile = $includeFile . '.' . $subPart; // Добавляем подчасть к имени файла
}
$standardIncFile = cot_incfile('admin', 'module', $includeFile); // Получаем полный путь к файлу для включения
if (in_array($includeFile, $standardAdmin) && file_exists($standardIncFile)) { // Если имя файла входит в стандартные файлы и файл существует
$route = new Route(); // Создаем новый объект маршрута
$route->includeFiles = [$standardIncFile]; // Добавляем найденный файл для включения
return $route; // Возвращаем объект маршрута с файлом для включения
}
return null; // Если файл не найден, возвращаем null
}
Этот метод проверяет, нужно ли подключить стандартный файл для админской части сайта в зависимости от параметров, переданных в запросе. Если найден подходящий файл для включения, он возвращает объект маршрута с этим файлом. Если нет, возвращает null
private function processAdminExtensionIncludeFiles( // Метод для обработки файлов расширений для включения в админской части
string $extensionCode, // Код расширения
string $extensionType, // Тип расширения (модуль или плагин)
?string $hook = null // Дополнительный параметр hook для настройки, может быть null
): ?Route // Возвращает объект Route с файлами для включения или null, если файлы не найдены
{
if ($hook === null) { // Если не указан параметр hook
if ($extensionType === ExtensionsDictionary::TYPE_MODULE) { // Если тип расширения - модуль
$hook = 'admin'; // Устанавливаем значение hook на 'admin' для модуля
} elseif ($extensionType === ExtensionsDictionary::TYPE_PLUGIN) { // Если тип расширения - плагин
$hook = 'tools'; // Устанавливаем значение hook на 'tools' для плагина
}
}
if ($hook === null) { // Если hook так и не был установлен
return null; // Возвращаем null, так как нет необходимости включать файлы
}
$route = new Route(); // Создаем новый объект маршрута
$route->extensionCode = $extensionCode; // Устанавливаем код расширения
$route->extensionType = $extensionType; // Устанавливаем тип расширения
$route->includeFiles = cot_getextplugins($hook, true, $extensionCode, $extensionType); // Получаем файлы для включения с помощью функции cot_getextplugins
if ($route->includeFiles !== []) { // Если файлы для включения найдены
return $route; // Возвращаем объект маршрута с найденными файлами
}
return null; // Если файлы не найдены, возвращаем null
}
private function prepareName(string $name): string // Метод для подготовки имени
{
return BaseController::prepareName($name); // Вызываем метод prepareName из BaseController для обработки имени
}
} // закрываем класс
Этот код обрабатывает файлы расширений (плагинов или модулей) для включения в админской части сайта. В зависимости от типа расширения (плагин или модуль), он устанавливает значение для параметра hook и ищет соответствующие файлы для включения. Если файлы найдены, возвращается объект маршрута с этими файлами, в противном случае возвращается null. Также есть метод prepareName, который вызывает аналогичный метод из базового контроллера для обработки имени.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 00:20
- Последнее обновление: 28.01.2025 00:33