Файл plugin.php в Cotonti
включает необходимые файлы плагина, и затем обрабатывает вывод в зависимости от того, как плагин должен отображаться
Основное назначение кода в файле plugin.php в системной папке Cotonti CMF — это обработка плагинов в рамках фреймворка. Он загружает плагин, проверяет права доступа, включает необходимые файлы плагина, и затем обрабатывает вывод в зависимости от того, как плагин должен отображаться (например, в виде всплывающего окна, через AJAX или как отдельная страница).
Вот основные моменты, которые раскрывает данный код:
- Параметры запроса и обработка входных данных:
- Код получает входные данные через глобальные массивы
$_GETи$_POST, например, такие какe,o,r,c1,c2— это параметры, которые используются для определения, какой плагин загружать и как его отображать.
- Код получает входные данные через глобальные массивы
- Проверка доступности плагина и прав пользователя:
- Перед тем как загружать плагин, выполняется проверка прав пользователя с использованием функции
cot_auth. Только те пользователи, которые имеют соответствующие права, могут просматривать или взаимодействовать с плагином.
- Перед тем как загружать плагин, выполняется проверка прав пользователя с использованием функции
- Автозагрузка файлов плагина:
- Автоматически подключаются необходимые файлы плагина (например, языковые файлы, ресурсы или функции), если такие файлы существуют.
- Настройка шаблона и вывод:
- В зависимости от типа плагина, его вывод может быть настроен через шаблон, который затем заполняется данными и выводится на странице.
- Режим совместимости:
- В коде присутствуют проверки на включение режима совместимости с предыдущими версиями (например, использование старых переменных и параметров), что позволяет обеспечить поддержку устаревших функций.
Характеристика стиля PHP:
-
Использование глобальных переменных: Код активно использует глобальные массивы, такие как
$_GET,$_POST, иCot::$sys. Это позволяет интегрировать плагин в систему с максимально гибким подходом. -
Условные конструкции: Применяются сложные условные конструкции для обработки различных сценариев загрузки плагинов (например, проверка наличия параметров и режима совместимости).
-
Работа с шаблонами: Используется объект
XTemplateдля обработки шаблонов и вывода данных на страницу, что характерно для фреймворков, ориентированных на разделение логики и представления. -
Использование функций фреймворка: Применяются встроенные функции фреймворка Cotonti, такие как
cot_import,cot_langfile,cot_breadcrumbsи другие, что позволяет интегрировать код с остальной системой. -
Проверки и обработки ошибок: В коде присутствуют механизмы для обработки ошибок (например, проверка на существование файлов и проверка прав доступа с использованием функции
cot_die_message).
В целом, стиль PHP, использованный в коде, можно охарактеризовать как классический объектно-ориентированный с элементами процедурного подхода, так как в нем активно используется ООП для работы с шаблонами и структурой данных, но также присутствуют и глобальные переменные и процедурные элементы для удобства работы с фреймворком.
/**
* Plugin loader
*
* @package Cotonti
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
// Загрузчик плагинов
//
// @package Cotonti
// @copyright (c) Cotonti Team
// @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
defined('COT_CODE') or die('Wrong URL'); // Проверка, что код выполняется в правильном контексте (COT_CODE должен быть определён)
// Input import
$e = cot_import('e', 'G', 'ALP'); // Получение параметра 'e' из GET-запроса с фильтрацией
$o = cot_import('o', 'G', 'ALP'); // Получение параметра 'o' из GET-запроса с фильтрацией
$r = (isset($_POST['r'])) ? cot_import('r','P','ALP') : cot_import('r','G','ALP'); // Получение параметра 'r' из POST, если он существует, или из GET
$c1 = cot_import('c1', 'G', 'ALP'); // Получение параметра 'c1' из GET-запроса с фильтрацией
$c2 = cot_import('c2', 'G', 'ALP'); // Получение параметра 'c2' из GET-запроса с фильтрацией
$autoAssignTags = false; // Флаг для автоматической привязки тегов, по умолчанию выключен
$templateFile = ''; // Переменная для хранения пути к шаблону, изначально пустая
if (!empty($o)) { // Если параметр 'o' не пустой
$extensionCode = $o; // Присваиваем переменной extensionCode значение 'o'
$hook = 'popup'; // Устанавливаем хук для всплывающих окон
Cot::$sys['displayHeader'] = Cot::$sys['displayFooter'] = false; // Отключаем отображение заголовка и подвала
$templateFile = cot_tplfile(['popup', $extensionCode]); // Определяем файл шаблона для popup
$autoAssignTags = true; // Включаем автоматическую привязку тегов
} elseif (!empty($r)) { // Если параметр 'r' не пустой
$extensionCode = $r; // Присваиваем переменной extensionCode значение 'r'
$hook = 'ajax'; // Устанавливаем хук для AJAX
Cot::$sys['displayHeader'] = Cot::$sys['displayFooter'] = false; // Отключаем отображение заголовка и подвала
} elseif (!empty($e)) { // Если параметр 'e' не пустой
$extensionCode = $e; // Присваиваем переменной extensionCode значение 'e'
$hook = 'standalone'; // Устанавливаем хук для standalone (отдельная страница)
$templateFile = cot_tplfile($extensionCode, 'plug'); // Определяем файл шаблона для плагина
if ($templateFile === null || !file_exists($templateFile)) { // Если файл шаблона не существует
$templateFile = cot_tplfile(['plugin', $extensionCode]); // Пытаемся найти шаблон для плагина
$autoAssignTags = true; // Включаем автоматическую привязку тегов
}
} else { // Если ни один из параметров не задан
cot_die_message(404); // Вызываем ошибку 404 (не найдено)
}
if (!file_exists(Cot::$cfg['plugins_dir'] . '/' . $extensionCode)) { // Проверяем существование плагина в каталоге плагинов
cot_die_message(404); // Если плагин не найден, выводим ошибку 404 (не найдено)
}
// Начальная проверка прав доступа
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('plug', Cot::$env['ext']); // Проверка прав пользователя на чтение, запись и администрирование плагина
cot_block(Cot::$usr['auth_read']); // Проверка, есть ли у пользователя право на чтение плагина
// Автоматическая загрузка требуемых файлов плагина
$requiredFiles = [ // Массив файлов, которые необходимо подключить для плагина
cot_langfile($extensionCode, 'plug'), // Подключение языкового файла плагина
cot_incfile($extensionCode, 'plug', 'resources'), // Подключение файла ресурсов плагина
cot_incfile($extensionCode, 'plug', 'functions'), // Подключение файла функций плагина
];
foreach ($requiredFiles as $requiredFile) { // Перебор всех файлов для подключения
if (file_exists($requiredFile)) { // Если файл существует
require_once $requiredFile; // Подключаем файл
}
}
// Отображение
$pluginBreadCrumbs = []; // Массив для хлебных крошек плагина
$pluginTitle = ''; // Заголовок плагина
$pluginSubtitle = ''; // Подзаголовок плагина
$pluginBody = ''; // Тело плагина
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включён режим совместимости
// @deprecated in 0.9.25
$plugin_subtitle = ''; // Устаревшая переменная для подзаголовка
$plugin_body = ''; // Устаревшая переменная для тела плагина
$popup_body = ''; // Устаревшая переменная для всплывающего окна
}
$t = null; // Инициализация переменной для шаблона
if (!empty($templateFile)) { // Если задан путь к шаблону
$t = new XTemplate($templateFile); // Создаём объект шаблона
}
$found = false; // Флаг для проверки, найден ли плагин
if (!empty($cot_plugins[$hook]) && is_array($cot_plugins[$hook])) { // Если для текущего хука существуют плагины
if (Cot::$cfg['debug_mode']) { // Если включён режим отладки
$cotHooksFired[] = $hook; // Добавляем хук в массив вызванных хуков
}
foreach ($cot_plugins[$hook] as $extensionRow) { // Перебираем плагины для текущего хука
if ($extensionRow['pl_code'] == $extensionCode) { // Если код плагина совпадает с текущим
$out['plu_title'] = $extensionRow['pl_title']; // Присваиваем заголовок плагина
$filename = Cot::$cfg['plugins_dir'] . '/' . $extensionRow['pl_file']; // Формируем путь к файлу плагина
if (is_readable($filename)) { // Если файл плагина доступен для чтения
include Cot::$cfg['plugins_dir'] . '/' . $extensionRow['pl_file']; // Подключаем файл плагина
$found = true; // Устанавливаем флаг, что плагин найден
break; // Прерываем цикл
}
}
}
}
if (!$found) { // Если плагин не найден
cot_die_message(404); // Выводим ошибку 404 (не найдено)
}
if (empty($out['subtitle'])) { // Если подзаголовок ещё не задан
if (empty(Cot::$L['plu_title']) && isset(Cot::$L[$extensionCode . '_title'])) { // Если заголовок плагина не задан и существует локализованный заголовок плагина
Cot::$L['plu_title'] = Cot::$L[$extensionCode . '_title']; // Присваиваем заголовок из локализованного массива
}
Cot::$out['subtitle'] = empty(Cot::$L['plu_title']) ? Cot::$out['plu_title'] : Cot::$L['plu_title']; // Если локализованный заголовок пуст, используем заголовок по умолчанию
}
Cot::$sys['sublocation'] = Cot::$out['subtitle']; // Устанавливаем подлокацию в системный массив
if ($autoAssignTags) { // Если автоматическое назначение тегов включено
array_unshift($pluginBreadCrumbs, [cot_url($e), Cot::$out['subtitle']]); // Добавляем хлебные крошки в начало массива
if (empty($o)) { // Если не задан параметр $o
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
// @deprecated in 0.9.25
if (!empty($plugin_subtitle)) { // Если подзаголовок плагина задан
$pluginTitle = $plugin_subtitle; // Присваиваем подзаголовок как заголовок плагина
}
if (!empty($plugin_body)) { // Если тело плагина задано
$pluginBody = $plugin_body; // Присваиваем тело плагина
}
}
$t->assign([ // Назначаем значения в шаблон
'BREADCRUMBS' => cot_breadcrumbs($pluginBreadCrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки
'TITLE' => $pluginTitle, // Заголовок плагина
'SUBTITLE' => $pluginSubtitle, // Подзаголовок плагина
'BODY' => $pluginBody, // Тело плагина
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
// @deprecated in 0.9.25
$t->assign([ // Назначаем устаревшие значения в шаблон
'PLUGIN_TITLE' => cot_breadcrumbs($pluginBreadCrumbs, Cot::$cfg['homebreadcrumb']),
'PLUGIN_SUBTITLE' => $pluginTitle,
'PLUGIN_BODY' => $pluginBody,
]);
}
} else { // Если задан параметр $o
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
// @deprecated in 0.9.25
if (!empty($popup_body)) { // Если тело всплывающего окна задано
$pluginBody = $popup_body; // Присваиваем тело всплывающего окна
}
}
cot_sendheaders(); // Отправка заголовков
$t->assign([ // Назначаем значения в шаблон
'POPUP_C1' => $c1, // Параметр для всплывающего окна
'POPUP_C2' => $c2, // Параметр для всплывающего окна
'BODY' => $pluginBody, // Тело плагина
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если включен режим совместимости
// @deprecated in 0.9.25
$t->assign([ // Назначаем устаревшие значения для всплывающего окна
'POPUP_BODY' => $pluginBody,
]);
}
}
}
$pluginTemplate = $t ?? null; // Если шаблон плагина существует, сохраняем его в переменную
require_once Cot::$cfg['system_dir'] . '/header.php'; // Подключаем файл header.php для начала страницы
if (!empty($pluginTemplate)) { // Если шаблон плагина существует
$t = $pluginTemplate; // Присваиваем шаблон плагина
}
unset($pluginTemplate); // Удаляем переменную с шаблоном плагина
if (isset($t) && is_object($t)) { // Если объект шаблона существует
$t->parse('MAIN'); // Парсим основной блок шаблона
$t->out('MAIN'); // Выводим основной блок шаблона
}
require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключаем файл footer.php для окончания страницы
Comments (0)
Content author
Offline
Administrator
Last logged: 2026-07-05 18:32
- Page published: 2025-01-24 14:02
- Last update: 2025-01-24 14:06