Обзор загрузчика и Введение в систему плагинов Cotonti
Подробный разбор самой концепции инициализации плагинов и анализ файла загрузчика (system/plugin.php). Изучаем процесс загрузки расширений, что бы понимать как создавать свои новые плагины для Cotonti.
Загрузчик плагинов в Cotonti: архитектура, принципы работы и рекомендации по разработке
Часть 1. Обзор загрузчика плагинов в Cotonti
Cotonti — это гибкая CMS, позволяющая расширять функциональность сайта через плагины. Сердцем этого расширения является система загрузки и инициализации плагинов, обеспечивающая безопасную работу с данными, шаблонами и ресурсами. Загрузчик плагинов выполняет несколько ключевых задач: обработку входящих параметров, проверку прав пользователя, подключение необходимых файлов, подготовку данных для шаблонов и вывод контента.
1.1 Цель загрузчика
Загрузчик плагинов отвечает за:
- Определение, какой плагин или объект нужно показать пользователю (плагин как полноценная страница, popup или отдельный объект через POST/GET-запрос).
- Обеспечение безопасности за счет фильтрации входных параметров.
- Проверку существования необходимых файлов и директорий плагина.
- Проверку прав пользователя (чтение, запись, администрирование).
- Подключение языковых файлов, ресурсов и функционала плагина.
- Подготовку данных для шаблона (хлебные крошки, заголовок, подзаголовок, тело контента).
- Правильный вывод контента — через XTemplate или напрямую, в зависимости от режима.
Другими словами, загрузчик — это «сердце» любого плагина, через него проходят все запросы, связанные с расширениями.
1.2 Работа с параметрами
В Cotonti плагин может быть вызван разными способами:
- Через URL с параметром
e, что означает стандартный плагин. - Через параметр
o, что указывает на popup или отдельный объект. - Через параметр
r, чаще всего используемый для POST-запросов или внутренних вызовов.
Каждый параметр проходит строгую фильтрацию для исключения опасного ввода, включая XSS и инъекции. Система оставляет только допустимые символы (латиницу и подчёркивания), что гарантирует безопасность работы с плагинами.
Эта схема позволяет одному загрузчику обрабатывать множество типов вызовов плагинов без дублирования логики. Разделение по типам (e, o, r) упрощает адаптацию к современным AJAX-запросам и стандартным URL, а также к legacy-режиму совместимости старых плагинов.
1.3 Контроль доступа
Загрузчик проверяет права пользователя для каждого плагина. Cotonti различает три уровня доступа:
- Чтение (view) — возможность просматривать контент плагина.
- Запись (write) — возможность изменять данные плагина.
- Администратор (admin) — полный контроль, включая изменение конфигурации плагина и управление доступом.
Если пользователь не имеет права чтения, доступ блокируется, и система отображает страницу с ошибкой 403 или 404. Такая схема делает плагины безопасными и предотвращает утечку данных.
1.4 Подключение файлов плагина
Каждый плагин в Cotonti состоит минимум из трёх обязательных компонентов:
- Языковой файл — содержит локализацию интерфейса.
- Ресурсы — CSS, JS, дополнительные данные.
- Функции — основной функционал плагина.
Загрузчик проверяет наличие этих файлов и подключает их через require_once, чтобы избежать дублирования и ошибок undefined function. Этот подход гарантирует, что весь функционал плагина доступен до начала генерации контента.
1.5 Подготовка данных для шаблона
После загрузки файлов, система готовит переменные для шаблона:
- Хлебные крошки, показывающие путь навигации.
- Заголовок и подзаголовок страницы.
- Основное тело контента.
При этом учитываются разные режимы: стандартная страница, popup или отдельный объект. Для стандартных страниц используется объект XTemplate, который принимает переменные и рендерит HTML. Для popup включаются HTTP-заголовки и отдельная обработка параметров (например, c1 и c2), а контент выводится без стандартного хедера и футера.
1.6 Особенности legacy-режима
Cotonti поддерживает устаревшие плагины и шаблоны через legacy-режим. В этом режиме переменные и теги дублируются, чтобы старые шаблоны продолжали корректно работать. Например, старые темы могут использовать {PLUGIN_BODY} вместо {BODY}. Загрузчик автоматически дублирует значения, чтобы обеспечить совместимость.
1.7 Вывод контента
После подготовки данных загрузчик выводит контент одним из двух способов:
Эта схема позволяет одинаково работать как со старой, так и с новой архитектурой Cotonti, поддерживая плагины разных поколений.