Routing для standalone-плагинов Cotonti в публичной части (front-end)
1. Что такое Hooks=standalone
В Cotonti плагины могут подключаться к различным хукам системы. Один из специальных типов — standalone.
Запись в заголовке файла:
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=standalone
[END_COT_EXT]
==================== */
означает, что данный файл является самостоятельной точкой входа плагина.
Файл с таким хуком:
- регистрируется системой как отдельная страница сайта
- вызывается напрямую через параметр
e в URL - выполняется после полной инициализации Cotonti
Как вызывается standalone-плагин
Стандартный вызов:
index.php?e=mrsmorder
или через функцию генерации URL:
cot_url('mrsmorder')
В этом случае Cotonti:
- загружает ядро системы
- инициализирует окружение
- находит плагин с
Hooks=standalone - выполняет соответствующий PHP-файл
Таким образом, standalone-файл играет ту же роль, что и контроллер страницы.
2. Routing в standalone-плагине
Cotonti не имеет встроенного маршрутизатора для standalone-плагинов, поэтому разработчик реализует маршрутизацию самостоятельно внутри файла точки входа.
Типовая схема:
plugin.php
├── plugin.new.php
├── plugin.details.php
├── plugin.incoming.php
└── plugin.outgoing.php
Главный файл анализирует параметры URL и подключает соответствующий режим работы.
3. Точка входа плагина
Файл:
mrsmorder.php
является центральным маршрутизатором плагина.
Заголовок расширения
[BEGIN_COT_EXT]
Hooks=standalone
[END_COT_EXT]
сообщает системе, что файл должен обрабатываться как standalone-страница.
4. Защита от прямого вызова
defined('COT_CODE') or die('Wrong URL');
Константа COT_CODE объявляется только при загрузке ядра Cotonti.
Это предотвращает выполнение файла при прямом обращении:
/plugins/mrsmorder/mrsmorder.php
5. Подключение зависимостей
require_once cot_incfile('mrsmorder', 'plug');
require_once cot_incfile('market', 'module');
require_once cot_incfile('users', 'module');
require_once cot_incfile('extrafields');
Функция cot_incfile() подключает основной файл расширения.
Формат:
cot_incfile(имя, тип, режим)
где:
| параметр | значение |
| имя | имя модуля или плагина |
| тип | module или plug |
| режим | необязательный режим |
Примеры:
plugins/mrsmorder/mrsmorder.php
plugins/mrsmorder/inc/mrsmorder.new.php
6. Определение локации
$env['location'] = 'mrsmorder';
Переменная $env['location'] используется Cotonti для:
- определения текущего раздела
- работы некоторых шаблонных функций
- формирования навигации
7. Белый список режимов
$valid_modes = ['incoming', 'outgoing', 'complaint', 'new', 'details'];
Это список разрешённых режимов работы.
Использование белого списка предотвращает:
- подключение произвольных файлов
- path traversal
- выполнение несанкционированного кода
8. Импорт параметров запроса
В Cotonti используется функция cot_import().
$m = cot_import('m', 'G', 'ALP');
$id = cot_import('id', 'G', 'INT');
$item_id = cot_import('item_id', 'G', 'INT');
Сигнатура
cot_import(имя, источник, тип)
| параметр | значение |
| имя | имя параметра |
| источник | G (GET), P (POST), C (COOKIE) |
| тип | тип фильтрации |
Используемые фильтры
| фильтр | описание |
ALP | буквы и цифры |
INT | целое число |
Таким образом обеспечивается базовая валидация входных данных.
9. Логика маршрутизации
Основная задача — определить значение $m.
if (empty($m) || !in_array($m, $valid_modes))
Если режим:
- отсутствует
- не входит в белый список
включается автоматическое определение.
9.1 Режим создания заказа
if ($item_id > 0) {
$m = 'new';
}
URL:
/index.php?e=mrsmorder&item_id=25
или
mrsmorder?item_id=25
Интерпретируется как:
создание заказа на товар
9.2 Просмотр заказа
elseif ($id > 0) {
$m = 'details';
}
URL:
mrsmorder?id=145
Открывает страницу деталей заказа.
9.3 Некорректный запрос
Если параметры отсутствуют:
cot_redirect(cot_url('message', 'msg=930', '', true));
Пользователь перенаправляется на стандартную страницу Cotonti:
message?msg=930
Сообщение 930 используется системой для обозначения неверного запроса.
10. Подключение файла режима
После определения $m выполняется:
require_once cot_incfile('mrsmorder', 'plug', $m);
Если $m = new, подключается:
plugins/mrsmorder/mrsmorder.new.php
Если $m = details:
plugins/mrsmorder/mrsmorder.details.php
Таким образом реализуется простая система маршрутизации.
11. Итоговая схема работы
URL
↓
standalone plugin
↓
mrsmorder.php
↓
анализ GET параметров
↓
определение режима ($m)
↓
подключение нужного файла
↓
mrsmorder.<mode>.php
12. Пример URL
создание заказа
mrsmorder?item_id=25
режим:
new
просмотр заказа
mrsmorder?id=15
режим:
details
список входящих заказов
mrsmorder?m=incoming
режим:
incoming
Рабочий пример файла маршрутизатора плагина
<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=standalone
[END_COT_EXT]
==================== */
/**
* Market Simple Mail Order plugin: standalone
* Файл: mrsmorder.php
* Описание: Точка входа для всех режимов плагина. Анализирует параметры URL
* и подключает соответствующий файл режима (new, details, incoming и т.д.)
*/
// Защита от прямого вызова файла без загрузки Cotonti
defined('COT_CODE') or die('Wrong URL');
// Подключаем основной файл функций плагина
require_once cot_incfile('mrsmorder', 'plug');
// Подключаем файлы модулей, которые могут понадобиться (например, для работы с товарами и пользователями)
require_once cot_incfile('market', 'module');
require_once cot_incfile('users', 'module');
// Подключаем файл для работы с дополнительными полями (extrafields)
require_once cot_incfile('extrafields');
// Устанавливаем переменную окружения для текущей локации (используется в некоторых шаблонах)
$env['location'] = 'mrsmorder';
// ────────────────────────────────────────────────
// Определение режима работы с защитой от прямого захода
// ────────────────────────────────────────────────
// Белый список допустимых режимов. Только эти значения параметра ?m= считаются корректными.
// Белый список $valid_modes предотвращает подключение произвольных файлов.
$valid_modes = ['incoming', 'outgoing', 'complaint', 'new', 'details'];
// cot_import — безопасная функция, очищает и валидирует входные данные.
// Импортируем параметр m из GET-запроса. ALP означает разрешены только буквы и цифры (безопасно).
$m = cot_import('m', 'G', 'ALP');
// Импортируем id заказа из GET, приводим к целому числу (0, если не задан или некорректен)
$id = cot_import('id', 'G', 'INT');
// Импортируем item_id (ID товара) из GET, также приводим к целому числу
$item_id = cot_import('item_id', 'G', 'INT');
// Проверяем, задан ли режим и является ли он допустимым
if (empty($m) || !in_array($m, $valid_modes)) {
// Если режим отсутствует или невалидный, пытаемся определить его по другим параметрам
// Если параметр item_id есть, а m нет — автоматически включается режим new.
// Если передан ID товара – значит пользователь хочет создать новый заказ на этот товар
if ($item_id > 0) {
$m = 'new'; // Устанавливаем режим "new" (форма заказа)
}
// Иначе если передан ID заказа – показываем детальную информацию о заказе
// Если есть id без m — режим details
elseif ($id > 0) {
$m = 'details'; // Устанавливаем режим "details" (детали заказа)
}
// Если нет ни одного параметра – переходим к странице с сообщением об ошибке 930 (неверный запрос)
// Если вообще ничего нет — редирект на стандартную страницу ошибки 930 (сообщение о неверном запросе)
else {
cot_redirect(cot_url('message', 'msg=930', '', true));
exit; // Прерываем выполнение после редиректа
}
}
// После этого блока переменная $m гарантированно содержит одно из допустимых значений.
// Подключаем файл, отвечающий за выбранный режим (например, mrsmorder.new.php)
require_once cot_incfile('mrsmorder', 'plug', $m);
Заключение
Standalone-плагин в Cotonti является самостоятельной точкой входа, доступной через параметр e в URL.
Маршрутизация внутри такого плагина реализуется вручную: анализируются параметры запроса и подключается соответствующий файл режима.
Ключевые элементы реализации:
Hooks=standalone- безопасный импорт параметров через
cot_import() - белый список режимов
- динамическое подключение файлов через
cot_incfile() - обработка некорректных запросов через
cot_redirect().
Такая архитектура позволяет организовать внутри одного standalone-плагина полноценную структуру страниц и действий.