Файл Router.php в Cotonti

Файл Router.php в движке Cotonti CMF (Content Management Framework) является частью системы маршрутизации, которая отвечает за обработку запросов, определение нужного контроллера и его действия в зависимости от параметров запроса. Этот файл играет ключевую роль в управлении тем, какой модуль, плагин или стандартная часть системы будет обрабатывать запросы в публичной и административной части сайта.

Основное назначение файла:

Файл Router.php отвечает за маршрутизацию запросов на сервере в зависимости от данных, переданных через URL-параметры (например, m, n, a, e, p и т. д.). В зависимости от этих параметров, система определяет:

  1. Тип расширения (модуль или плагин).
  2. Контроллер и действие для обработки запроса.
  3. Загружается соответствующий контроллер и выполняется нужное действие.

В случае, если не удается найти подходящий контроллер или действие, возбуждается исключение NotFoundHttpException.

Место в системе:

Файл Router.php является важной частью системы обработки запросов в движке Cotonti. Он работает с другими компонентами фреймворка, такими как:

  • Контроллеры: Определяет, какой контроллер и его метод (действие) должны быть выполнены.
  • Расширения (Extensions): Определяет, какой тип расширения (модуль или плагин) должен быть активирован для обработки запроса.
  • Обработка URL: Перехватывает URL-запросы и преобразует их в внутренние команды для выполнения.

Этот файл предоставляет основной механизм для работы с запросами как для публичной части сайта (Frontend), так и для административной панели (Admin).

Суть содержания кода:

  1. Основной метод маршрутизации - метод route(), который выполняет основную маршрутизацию для публичной части сайта, обрабатывает параметры запроса, такие как код расширения, контроллер и действие, и возвращает соответствующий маршрут.

  2. Маршрутизация для административной части - метод routeAdmin(), который обрабатывает маршруты для админки сайта. Он включает в себя специфические проверки и логику для обработки запросов, связанных с администрированием.

  3. Дополнительные методы для обработки расширений и включаемых файлов - методы, которые обрабатывают подключаемые файлы расширений для фронтенда и админки, а также обеспечивают поддержку для плагинов и модулей.

  4. Обработка контроллеров и действий - методы processController() и getControllerClass() позволяют определять, какой контроллер и его действие нужно загрузить для обработки запроса.

Список классов в файле:

  1. Router - основной класс маршрутизатора, который управляет процессом маршрутизации запросов в системе Cotonti.

Список методов и функций в файле:

  1. route() — основной метод маршрутизации для публичной части сайта.
  2. routeAdmin() — маршрутизация для административной части сайта.
  3. routeAdminOther() — маршрутизация для других разделов админки.
  4. processController() — обработка контроллера, определение действия и загрузка соответствующего контроллера.
  5. getController() — получение контроллера по его ID.
  6. getControllerClass() — получение имени класса контроллера.
  7. getActionName() — получение имени действия в контроллере.
  8. processFrontIncludeFiles() — обработка файлов расширений для включения в публичной части.
  9. processAdminCoreIncludeFiles() — обработка файлов ядра для админки.
  10. processAdminExtensionIncludeFiles() — обработка файлов расширений для админки.
  11. 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, который вызывает аналогичный метод из базового контроллера для обработки имени.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

19 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 28.01.2025 00:20
  • Последнее обновление: 28.01.2025 00:33