Файл ExtensionsControlService.php в Cotonti

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

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

Основная цель файла — предоставить логику для работы с расширениями, включая управление их состоянием (активен/неактивен), а также для работы с частями этих расширений (например, отдельными плагинами или их компонентами).

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

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

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

  • checkIsActive: Проверяет, активно ли расширение, и обновляет его состояние в базе данных (таблица cot_core).
  • pause: Приостанавливает расширение или его часть. Этот метод изменяет состояние расширения на "неактивное" в базе данных.
  • resume: Возобновляет работу расширения или его части, изменяя состояние на "активное".
  • hasActiveParts: Проверяет, есть ли у расширения активные части. Если такие части есть, возвращает true, иначе — false.

Классы в файле

  • ExtensionsControlService: Это единственный класс в файле, который реализует логику управления расширениями в Cotonti CMF. Он использует трейт GetInstanceTrait, что позволяет применять паттерн "Одиночка" (Singleton) для управления экземпляром этого класса.

Методы и функции в файле

  1. checkIsActive(string $extensionCode): bool: Метод для проверки активности расширения и обновления его состояния в базе данных.
  2. pause(string $extensionCode, $part = null): bool: Метод для приостановки расширения или его части. Если передан идентификатор или имя части, будет приостановлена именно эта часть.
  3. resume(string $extensionCode, $part = null): bool: Метод для возобновления работы расширения или его части.
  4. hasActiveParts(string $extensionCode): bool: Приватный метод, проверяющий наличие активных частей у расширения. Это помогает определить, активен ли сам модуль или плагин.

Заключение

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

находится по адресу: /system/extensions/ExtensionsControlService.php движка php-фреймворка.

 

declare(strict_types=1); // Включение строгой типизации для этого файла, чтобы типы данных проверялись строго

namespace cot\extensions; // Определение пространства имён для класса ExtensionsControlService в папке extensions

use Cot; // Подключение глобального объекта Cot, который является основной точкой доступа ко всем сервисам системы
use cot\traits\GetInstanceTrait; // Подключение трейта GetInstanceTrait, который добавляет функциональность синглтона
use InvalidArgumentException; // Подключение класса исключения для обработки некорректных аргументов
use Throwable; // Подключение интерфейса Throwable для обработки всех типов исключений
class ExtensionsControlService // Класс для управления состоянием расширений
{
    use GetInstanceTrait; // Используется трейт для реализации паттерна Singleton (единый экземпляр)

    /**
     * Проверяет, активно ли расширение, и обновляет данные в таблице "cot_core"
     * @return void
     * @todo более понятное имя метода
     */
    public function checkIsActive(string $extensionCode): bool // Метод для проверки активности расширения
    {
        if ($this->hasActiveParts($extensionCode)) { // Если у расширения есть активные части
            $data = ['ct_state' => 1]; // Устанавливаем состояние расширения как активное
        } else {
            $data = ['ct_state' => 0]; // Если активных частей нет, устанавливаем состояние как неактивное
        }

        $result = Cot::$db->update(Cot::$db->core, $data, 'ct_code = :code', ['code' => $extensionCode]); // Выполняем обновление данных в таблице "cot_core", где код расширения совпадает с переданным

        return $result > 0; // Если обновление прошло успешно (обновлено больше одной строки), возвращаем true, иначе false
    }
    /**
     * Приостанавливает плагин или одну из его частей
     *
     * @param string $extensionCode Код модуля или плагина
     * @param int|string|null $part Идентификатор части расширения для приостановки или NULL для приостановки всех;
     *  если передано имя части, то приостанавливается именно эта часть
     * @return bool
     * @throws Throwable
     */
    public function pause(string $extensionCode, $part = null): bool // Метод для приостановки расширения или его части
    {
        $condition = 'pl_code = :code'; // Условие для поиска расширения по коду
        $params = ['code' => $extensionCode]; // Параметры для запроса с кодом расширения
        if (is_numeric($part)) { // Если часть указана как число
            if ($part <= 0) { // Если идентификатор части меньше или равен 0, это недопустимо
                throw new InvalidArgumentException(); // Генерируем исключение с ошибкой аргумента
            }
            $condition .= ' AND pl_id = :pluginId'; // Добавляем дополнительное условие для части с идентификатором
            $params['pluginId'] = $part; // Добавляем параметр для идентификатора части
        } elseif (is_string($part)) { // Если часть указана строкой (например, имя)
            $condition .= ' AND pl_part = :part'; // Добавляем условие для имени части
            $params['part'] = $part; // Добавляем параметр для имени части
        }

        Cot::$db->beginTransaction(); // Начинаем транзакцию
        try {
            $result = Cot::$db->update(Cot::$db->plugins, ['pl_active' => 0], $condition, $params); // Обновляем статус активности плагина или части, устанавливаем в неактивное состояние
            if ($result < 1) { // Если обновлений не было (ни одна строка не была изменена)
                return false; // Возвращаем false, так как плагин не был приостановлен
            }

            $this->checkIsActive($extensionCode); // Проверяем состояние активности расширения после приостановки

            Cot::$db->commit(); // Подтверждаем транзакцию
        } catch (Throwable $e) { // Если возникла ошибка при обновлении
            Cot::$db->rollBack(); // Откатываем транзакцию
            throw $e; // Бросаем исключение дальше
        }

        return true; // Если все прошло успешно, возвращаем true
    }
    /**
     * Возобновляет приостановленное расширение или одну из его частей
     *
     * @param string $extensionCode Код модуля или плагина
     * @param mixed $part Идентификатор части расширения для возобновления или NULL для возобновления всех;
     *  если передано имя части, то возобновляется именно эта часть
     * @return bool
     */
    public function resume(string $extensionCode, $part = null): bool // Метод для возобновления работы расширения или его части
    {
        $condition = 'pl_code = :code'; // Условие для поиска расширения по коду
        $params = ['code' => $extensionCode]; // Параметры для запроса с кодом расширения
        if (is_numeric($part)) { // Если часть указана как число
            if ($part <= 0) { // Если передан некорректный идентификатор части
                throw new InvalidArgumentException(); // Генерируем исключение с ошибкой аргумента
            }
            $condition .= ' AND pl_id = :pluginId'; // Добавляем дополнительное условие для части с идентификатором
            $params['pluginId'] = $part; // Добавляем параметр для идентификатора части
        } elseif (is_string($part)) { // Если часть указана строкой (например, имя)
            $condition .= ' AND pl_part = :part'; // Добавляем условие для имени части
            $params['part'] = $part; // Добавляем параметр для имени части
        }

        Cot::$db->beginTransaction(); // Начинаем транзакцию
        try {
            $result = Cot::$db->update(Cot::$db->plugins, ['pl_active' => 1], $condition, $params) > 0; // Обновляем статус активности плагина или его части, устанавливаем в активное состояние
            if ($result < 1) { // Если обновлений не было (ни одна строка не была изменена)
                return false; // Возвращаем false, так как плагин не был возобновлен
            }

            Cot::$db->update( // Обновляем состояние активности расширения в таблице core, устанавливаем в активное состояние
                Cot::$db->core,
                ['ct_state' => 1],
                'ct_code = :code',
                ['code' => $extensionCode]
            ) > 0;

            Cot::$db->commit(); // Подтверждаем транзакцию
        } catch (Throwable $e) { // В случае ошибки
            Cot::$db->rollBack(); // Откатываем транзакцию
            throw $e; // Бросаем исключение
        }

        return true; // Если все прошло успешно, возвращаем true
    }
    private function hasActiveParts(string $extensionCode): bool // Метод для проверки наличия активных частей у расширения
    {
        $service = ExtensionsService::getInstance(); // Получаем экземпляр сервиса для работы с расширениями
        if ( // Если у расширения есть дефолтное действие или активная часть
            $service->getDefaultAction($extensionCode) !== null
            || $service->getDefaultAction($extensionCode, '', true) !== null
        ) {
            return true; // Если есть активные части или дефолтное действие, возвращаем true
        }

        $activeCount = Cot::$db->query( // Выполняем запрос для подсчета активных частей расширения
            'SELECT COUNT(*) FROM ' . Cot::$db->plugins. ' WHERE pl_code = :code AND pl_active = 1', // Подсчитываем количество активных частей для данного расширения
            ['code' => $extensionCode]
        )->fetchColumn(); // Получаем значение из первой колонки (количество активных частей)

        return $activeCount > 1; // Если активных частей больше одного, возвращаем true, иначе false
    }

}

 

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

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

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

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

Administrator

Оффлайн

Administrator

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

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