Глава 6. Архитектура и разработка модулей

07-07-26 10:36

Эта глава представляет собой подробное руководство для разработчиков, создающих собственные функциональные модули для CMS Seditio. В ней рассматриваются файловая структура кастомного модуля, формат манифеста установки, интеграция в панель управления, механизм роутинга ЧПУ и разграничение прав доступа.


6.1. Структура каталогов и файлы кастомного модуля

Все модули Seditio физически размещаются в каталоге modules. Каждый модуль должен находиться в собственной папке, имя которой совпадает с системным кодом модуля (например, modules/gallery или modules/mymodule).

6.1.1. Соглашение об именах и файловая структура

Ниже представлена стандартная файловая структура модуля с именем mymodule:

modules/mymodule/
├── mymodule.php                # Главный публичный контроллер (точка входа)
├── mymodule.setup.php          # Манифест установки и конфигурация модуля
├── mymodule.install.php        # Скрипт, выполняемый при установке модуля (опционально)
├── mymodule.uninstall.php      # Скрипт, выполняемый при удалении модуля (опционально)
├── mymodule.urls.php           # Правила ЧПУ роутинга модуля (входящие/исходящие)
├── admin/
│   ├── mymodule.admin.php      # Панель управления модулем в админке (опционально)
│   └── mymodule.admin.menu.php # Кнопка меню в сайдбаре панели управления (опционально)
├── inc/
│   └── mymodule.functions.php  # Дополнительные функции и API модуля (опционально)
├── lang/
│   ├── mymodule.en.lang.php    # Английская локализация модуля
│   └── mymodule.ru.lang.php    # Русская локализация модуля
└── tpl/
    ├── mymodule.tpl            # Шаблон вывода публичной части
    └── admin.mymodule.tpl      # Шаблон вывода панели управления модуля

6.1.2. Публичный контроллер mymodule.php

Это главный файл модуля, который обрабатывает запросы посетителей. Вызов модуля осуществляется через фронт-контроллер Seditio: index.php?module=mymodule. Каждый исполняемый PHP-файл модуля в целях безопасности обязан начинаться с проверки константы SED_CODE:

if (!defined('SED_CODE')) {
	die('Wrong URL.');
}

Контроллер отвечает за обработку входящих GET/POST параметров, работу с базой данных, подключение шаблонов через XTemplate и вывод результирующего контента в глобальную переменную $main:

$t = new XTemplate(sed_skinfile('mymodule', false, true));
// ... логика контроллера ...
$t->parse('MAIN');
$main .= $t->text('MAIN');

6.1.3. Административный раздел модуля

Если у модуля есть настройки или административные панели управления (задано Admin=1 в секции [BEGIN_SED_MODULE]), то:

  • В панели управления по адресу /admin/mymodule (или index.php?module=admin&m=mymodule при отключенном ЧПУ) ядро Seditio автоматически подключит контроллер admin/mymodule.admin.php (в качестве примера можно изучить структуру административного раздела модуля страниц).
  • Чтобы пункт управления модулем отобразился в левом сайдбаре панели управления, создается файл admin/mymodule.admin.menu.php. В нем объявляется элемент меню:
    $adminmenu[] = array(
        'code' => 'mymodule',
        'title' => $L['My_Module_Title'],
        'url' => sed_url('admin', 'm=mymodule'),
        'icon' => 'folder' // Название SVG-иконки или класс иконки
    );
    

6.2. Файл манифеста и конфигурации {имя_модуля}.setup.php

Файл .setup.php (например, page.setup.php) содержит служебную информацию для инсталлятора Seditio. Он сообщает ядру, как зарегистрировать модуль в базе данных, какие создать права доступа по умолчанию и какие опции конфигурации добавить в панель управления.

Манифест состоит из трех основных блоков комментариев.

6.2.1. Метаданные файла ([BEGIN_SED])

Обычный блок с информацией о самом файле:

/* ====================
[BEGIN_SED]
File=modules/mymodule/mymodule.setup.php
Version=185
Updated=2026-feb-14
Type=Module
Author=Developer Name
Description=Custom Module for Seditio
[END_SED]
*/

6.2.2. Параметры модуля ([BEGIN_SED_MODULE])

Содержит инструкции по интеграции модуля в систему разграничения прав и базу данных:

[BEGIN_SED_MODULE]
Code=mymodule                    ; Уникальный текстовый код модуля
Name=My Module                    ; Название модуля для админки
Description=Handles custom tasks  ; Описание модуля
Version=1.0.0                     ; Версия модуля
Date=2026-feb-15                  ; Дата выпуска
Author=Developer                  ; Автор
Copyright=                        ; Копирайт
Notes=                            ; Важные заметки
Requires=                         ; Список кодов других модулей/плагинов, нужных для работы
Admin=1                           ; 1 - есть панель управления в /admin/mymodule, 0 - нет
Auth_guests=R                     ; Права гостей по умолчанию при установке (Read)
Lock_guests=W12345A               ; Запрещенные (заблокированные) права для гостей
Auth_members=RW                   ; Права участников по умолчанию (Read + Write)
Lock_members=12345A               ; Запрещенные права для участников
Lock_module=0                     ; 1 - системный (нельзя удалить), 0 - обычный модуль
[END_SED_MODULE]

6.2.3. Конфигурация модуля ([BEGIN_SED_MODULE_CONFIG])

Объявляет настройки модуля, которые будут доступны администратору в разделе настроек конфигурации по адресу /admin/config?n=edit&o=module&p=mymodule (или index.php?module=admin&m=config&n=edit&o=module&p=mymodule без ЧПУ). Каждая строка представляет собой переменную конфигурации в следующем формате: имя_переменной=порядок:тип:варианты:значение_по_умолчанию:описание

Пример:

[BEGIN_SED_MODULE_CONFIG]
maxitems=01:select:5,10,15,20,25:10:Максимум элементов на страницу
enable_custom=02:radio::1:Включить кастомные функции (1 - да, 0 - нет)
api_key=03:string::default_key:Ключ API для интеграции
intro_text=04:text::Приветствие:Текст в шапке модуля
[END_SED_MODULE_CONFIG]

Типы полей конфигурации:

  • string — однострочное текстовое поле.
  • select — выпадающий список (варианты перечисляются через запятую в третьем параметре).
  • radio — переключатель Да/Нет (1/0).
  • text — многострочное поле ввода (textarea).
  • custom — поле со сложным вводом, управляемое кастомной функцией.

Все объявленные опции автоматически записываются в таблицу sed_config и доступны в коде через глобальный массив $cfg['plugin']['mymodule']['имя_переменной'] (для плагинов) или $cfg['mymodule']['имя_переменной'] (для модулей).


6.3. Инсталляционные скрипты модуля

При установке или удалении модуля администратором ядро выполняет дополнительные действия, если в каталоге модуля присутствуют файлы инсталляции.

6.3.1. Установка модуля (mymodule.install.php)

Скрипт запускается автоматически сразу после регистрации модуля в таблице sed_auth и записи настроек конфигурации. Обычно он используется для создания кастомных таблиц модуля в базе данных:

<?php
if (!defined('SED_CODE') || !defined('SED_ADMIN')) { die('Wrong URL.'); }

// Создание таблицы модуля
$db_my_table = $cfg['sqldbprefix'] . 'my_table';
$sql = sed_sql_query("CREATE TABLE IF NOT EXISTS $db_my_table (
    item_id int(11) NOT NULL auto_increment,
    item_title varchar(255) NOT NULL default '',
    item_date int(11) NOT NULL default '0',
    PRIMARY KEY (item_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

Также здесь можно выполнять любые системные действия (например, проверку версии PHP, создание папок кэша в /datas/ и установку прав chmod).

6.3.2. Удаление модуля (mymodule.uninstall.php)

Запускается при удалении модуля из панели управления. Его основная задача — корректно очистить базу данных от кастомных таблиц и полей, созданных модулем, чтобы не оставлять «мусора» в СУБД:

<?php
if (!defined('SED_CODE') || !defined('SED_ADMIN')) { die('Wrong URL.'); }

$db_my_table = $cfg['sqldbprefix'] . 'my_table';
sed_sql_query("DROP TABLE IF EXISTS $db_my_table;");

Удаление записей из таблиц sed_config и sed_auth ядро Seditio производит автоматически по коду модуля.


6.4. Разработка правил ЧПУ для модуля {имя_модуля}.urls.php

Для того чтобы модуль поддерживал красивые ЧПУ (дружественные URL), разработчик должен предоставить правила роутинга в файле {имя_модуля}.urls.php. Образец таких правил можно изучить в файле ЧПУ страниц page.urls.php.

Файл должен возвращать значение приоритета и правила преобразования.

6.4.1. Приоритет разбора ЧПУ ($mod_urlrewrite_order)

Эта переменная задает вес/очередность выполнения правил регулярных выражений данного модуля. Чем меньше число, тем раньше правила будут обработаны парсером ЧПУ:

$mod_urlrewrite_order = 500;

6.4.2. Входящие роуты ($mod_urlrewrite)

Массив $mod_urlrewrite содержит правила сопоставления URL, введенных пользователем в адресную строку браузера, с внутренними параметрами скрипта:

$mod_urlrewrite = array(
    // Пример ЧПУ: /mymodule/125/view
    array(
        'order' => 500,
        'cond' => '#^/mymodule/([0-9]+)/view(/?)$#',
        'rule' => 'modules/mymodule/mymodule.php?id=$1&action=view'
    ),
    // Пример ЧПУ: /mymodule/category-name/
    array(
        'order' => 510,
        'cond' => '#^/mymodule/([a-zA-Z0-9_-]+)/$#',
        'rule' => 'modules/mymodule/mymodule.php?cat=$1'
    )
);
  • cond — регулярное выражение для сопоставления ЧПУ-адреса.
  • rule — внутренний адрес запроса Seditio, на который будет негласно перенаправлен посетитель.

6.4.3. Исходящие ссылки ($mod_urltrans)

Массив $mod_urltrans описывает, как функция генерации адресов sed_url() должна собирать ЧПУ-ссылки при выводе их в шаблонах:

$mod_urltrans = array();
$mod_urltrans['mymodule'] = array(
    // Преобразует sed_url('mymodule', 'id=125&action=view') в /mymodule/125/view
    array(
        'params' => 'id=*&action=*',
        'rewrite' => 'mymodule/{id}/{action}'
    ),
    // Преобразует sed_url('mymodule', 'cat=sports') в /mymodule/sports/
    array(
        'params' => 'cat=*',
        'rewrite' => 'mymodule/{cat}/'
    )
);

6.5. Проверка прав доступа (ACL) в коде модуля

Разграничение прав доступа для модуля строится на стандартной битовой маске ACL Seditio.

6.5.1. Регистрация прав модуля

При инсталляции модуля ядро проверяет поля Auth_guests и Auth_members в файле setup.php и автоматически создает строки прав для всех существующих групп пользователей в таблице sed_auth. Код области доступа (auth_code) будет соответствовать системному коду модуля (в нашем примере mymodule).

6.5.2. Проверка прав в PHP-коде

Для разграничения доступа к функциям модуля разработчик должен вызвать системную функцию sed_auth():

// Получаем права текущего пользователя на модуль 'mymodule'
// Второй параметр 'a' указывает на базовую секцию модуля
list($usr['auth_read'], $usr['auth_write'], $usr['isadmin']) = sed_auth('mymodule', 'a');

Полученные переменные используются для блокировки несанкционированных действий:

// Полная блокировка страницы, если у пользователя нет прав на чтение (Read)
sed_block($usr['auth_read']);

// Запрет отправки формы, если нет прав на запись (Write)
if ($action == 'save' && !$usr['auth_write']) {
    sed_redirect(sed_url('mymodule', '', '', true));
    exit;
}

// Показ административных ссылок модераторам
if ($usr['isadmin']) {
    $t->assign("ADMIN_ACTIONS_URL", sed_url('admin', 'm=mymodule'));
    $t->parse("MAIN.ADMIN_ZONE");
}

Благодаря этой схеме модуль полностью интегрируется в глобальную систему безопасности Seditio и позволяет администратору гибко настраивать доступы через панель управления группами.

Оценка:
(0.00)

Пока комментариев нет