Файл 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 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Article multicategories

Additional categories where this article is shown as similar.

Content author

Administrator

Offline

Administrator

Last logged: 2026-09-13 14:50

  • Page published: 2025-01-28 00:50
  • Last update: 2025-01-28 00:53