Файл ExtensionsControlService.php в Cotonti
Основное назначение файла
Файл ExtensionsControlService.php в движке Cotonti CMF отвечает за управление состоянием расширений (модулей и плагинов). Он предоставляет методы для проверки состояния активности расширений, их приостановки (паузы) и возобновления работы. Это критически важная часть системы, так как она позволяет динамически изменять состояние расширений и корректно обновлять данные в базе данных.
Основная цель файла — предоставить логику для работы с расширениями, включая управление их состоянием (активен/неактивен), а также для работы с частями этих расширений (например, отдельными плагинами или их компонентами).
Место в системе
Этот файл является частью системы управления расширениями Cotonti CMF и обрабатывает операции, которые напрямую связаны с состоянием активных расширений, включая их активацию и деактивацию. Этот сервис тесно взаимодействует с базой данных, где хранятся все состояния расширений, и обновляет эти данные при изменении состояния расширений. Взаимодействие с базой данных и модификация данных о состоянии расширений являются важной частью работы всего фреймворка.
Суть содержания кода
checkIsActive: Проверяет, активно ли расширение, и обновляет его состояние в базе данных (таблицаcot_core).pause: Приостанавливает расширение или его часть. Этот метод изменяет состояние расширения на "неактивное" в базе данных.resume: Возобновляет работу расширения или его части, изменяя состояние на "активное".hasActiveParts: Проверяет, есть ли у расширения активные части. Если такие части есть, возвращаетtrue, иначе —false.
Классы в файле
ExtensionsControlService: Это единственный класс в файле, который реализует логику управления расширениями в Cotonti CMF. Он использует трейтGetInstanceTrait, что позволяет применять паттерн "Одиночка" (Singleton) для управления экземпляром этого класса.
Методы и функции в файле
checkIsActive(string $extensionCode): bool: Метод для проверки активности расширения и обновления его состояния в базе данных.pause(string $extensionCode, $part = null): bool: Метод для приостановки расширения или его части. Если передан идентификатор или имя части, будет приостановлена именно эта часть.resume(string $extensionCode, $part = null): bool: Метод для возобновления работы расширения или его части.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
}
}
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 00:50
- Последнее обновление: 28.01.2025 00:53