Routing для standalone-плагинов Cotonti

Rating based on reviews:
Total stars received: 0
Total reviews: 0
Average rating: 0
Filed under: User Blog

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:

  1. загружает ядро системы
  2. инициализирует окружение
  3. находит плагин с Hooks=standalone
  4. выполняет соответствующий 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-плагина полноценную структуру страниц и действий.

 



Reviews

No reviews yet


Comments (0)

No comments yet
Only registered users can post new comments

Similar pages

Список плагинов для Cotonti Siena
1 Каталог плагинов Cotonti Siena, для расширения функционала своего сайта до маркетплейса, фриланс-биржи,
User Blog • 2020-07-17 05:15 webitproff
Стартовая сборка плагинов и модулей
2 Стартовая, базовой комплектации бесплатная сборка плагинов и модулей для организации фриланс-биржи на Cotonti
User Blog • 2020-07-17 05:15 webitproff
Локализация и языковые переводы плагинов и модулей в Cotonti
3 Локализация плагинов и модулей в Cotonti: полный практический разбор от принципов до вывода в
AJAX-части плагинов в Cotonti Siena. Принципы и примеры
4 AJAX-части плагинов в Cotonti Siena техническое руководство (фактическое описание, основано по-большей части из старой
Cotonti Siena CMF • 2026-03-10 08:45 webitproff
Установка плагинов
5 Установка плагинов 1. Введение Что такое Расширение По сути — это PHP-скрипт (или их набор), включаемый в заранее

Content author

webitproff

Offline

Sodium Carbonate

Last logged: 2026-07-20 14:34

  • Чем могу помочь?

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

  • Разработки на GitHub бесплатно
    • Page published: 2026-03-10 07:38
    • Last update: 2026-03-10 09:21