В этой главе подробно рассматривается архитектура, внутреннее устройство, структура хранения данных и возможности семи ключевых встроенных модулей CMS Seditio: модулей Страниц (page), Форумов (forums), Пользователей (users), Персональной Файловой Системы (pfs), Личных сообщений (pm), Опросов (polls) и Галереи (gallery).
[!NOTE]
Панели администрирования встроенных модулей (размещаемые в подкаталогах
admin/) подключаются динамически ядром. Подробное описание механизма роутинга панелей администрирования встроенных модулей приведено в Главе 3. Панель управления. Административная зона.
5.1. Модуль страниц (page)
Модуль страниц — это основной контентный компонент Seditio. Он отвечает за создание, структурирование, редактирование, сортировку и вывод текстовых и мультимедийных материалов на сайте. Основной код модуля сосредоточен в каталоге modules/page.
5.1.1. Дерево категорий и структура контента
Вся иерархия разделов (категорий) страниц хранится в единой таблице структуры sed_structure.
- Каждая категория идентифицируется уникальным текстовым кодом в поле
structure_code(например,news,articles,sport). - Иерархическая связь (вложенность разделов) строится на основе поля пути
structure_path. Например, если родительский раздел имеет путь1, то его подраздел получит путь1.1, а подраздел следующего уровня —1.1.1. - Данные страниц связываются с категориями через поле
page_catтаблицыsed_pages, которое ссылается на соответствующийstructure_code.
5.1.2. Жизненный цикл страницы и Менеджер страниц
Каждая страница в таблице sed_pages проходит через определенный цикл состояний, контролируемый полем page_state:
- Опубликована (
page_state = 0): Страница полностью активна, видна всем посетителям сайта, у которых есть права на чтение (Read) данной категории. - На валидации (
page_state = 1): Страница отправлена на модерацию. Она не отображается в общих списках контента для обычных пользователей. Модераторы и администраторы видят такие страницы в специальной панели «Очередь валидации» и могут утвердить их публикацию. - Автором материала выступает пользователь, чей ID записан в поле
page_ownerid(связано отношениемLEFT JOINс таблицейsed_users).
Для массового управления контентом администраторам доступен Менеджер страниц (скрипт page.admin.manager.php), открывающийся в панели управления по адресу /admin/page?s=manager (или index.php?module=admin&m=page&s=manager при отключенном ЧПУ). С его помощью можно:
- Быстро фильтровать все страницы сайта по конкретной категории.
- Отслеживать статусы страниц (опубликовано/на валидации).
- Производить групповое модерирование:
- Утверждать публикации: ссылка
/admin/page?a=validate&id=X(илиindex.php?module=admin&m=page&a=validate&id=Xбез ЧПУ). - Временно снимать страницы с публикации: ссылка
/admin/page?a=unvalidate&id=X(илиindex.php?module=admin&m=page&a=unvalidate&id=Xбез ЧПУ). - Клонировать существующие материалы: ссылка
/admin/page?s=add&id=X&a=clone(илиindex.php?module=admin&m=page&s=add&id=X&a=cloneбез ЧПУ), обрабатываемая контроллеромmodules/page/page.add.phpпри$a == 'clone'. - Безвозвратно удалять страницы: ссылка
/admin/page?s=manager&a=delete&id=X(илиindex.php?module=admin&m=page&s=manager&a=delete&id=Xбез ЧПУ).
- Утверждать публикации: ссылка
5.1.3. Сортировка страниц в категориях
Seditio поддерживает гибкую настройку сортировки страниц индивидуально для каждого раздела структуры. Параметры сортировки по умолчанию задаются в настройках категорий (таблица sed_structure):
structure_order— колонка базы данных, по которой происходит сортировка:date(по дате публикацииpage_date).title(по алфавиту заголовкаpage_title).id(по уникальному идентификаторуpage_id).owner(по ID автораpage_ownerid).count(по популярности/просмотрамpage_count).
structure_way— направление сортировки:asc— по возрастанию (от А до Я, от старых к новым).desc— по убыванию (от Я до А, от новых к старым).
Эти параметры учитываются ядром при генерации списков страниц (контроллер page.php), но при необходимости в Менеджере страниц или кастомных выборках порядок сортировки может быть переопределен через GET-параметры sm (сортируемое поле) и wm (направление).
5.1.4. Парсинг и форматирование контента
При создании и редактировании страниц контент сохраняется в поле page_text таблицы sed_pages. Для форматирования контента используется HTML-разметка, интегрированная с визуальными WYSIWYG-редакторами (по умолчанию поставляется плагин CKEditor).
Для обеспечения безопасности и эстетичности текстов Seditio использует фильтр-типограф Jevix (класс plugins/jevix/inc/jevix.class.php), который интегрирован в систему фильтрации входящих данных ядра:
- Точка интеграции (Хук
import.filter): При импорте HTML-данных из форм через функциюsed_import()с использованием типа фильтра'HTM', ядро Seditio автоматически вызывает плагины, зарегистрированные на хукimport.filter(скриптplugins/jevix/jevix.import.filter.php). - Динамическая жесткость фильтрации: В зависимости от текущего системного раздела (значения переменной
$flocation/$location), плагин выбирает один из предопределенных уровней строгости настроек Jevix (например,fullдля страниц и плагинов,mediumдля личных сообщений и комментариев,microдля PFS, галереи и опросов). - Безопасность (XSS-фильтрация): Он очищает входящий HTML-код от опасных тегов и скриптов. Разрешает использование только тегов из белого списка соответствующего профиля сложности (
<p>,<span>,<a>,<img>и др.) и жестко контролирует их атрибуты (например, разрешает загрузку<iframe>только с доверенных видеохостингов вродеyoutube.comилиvimeo.com). - Типографирование: Выполняет автоматическое форматирование текста: преобразует обычные кавычки в кавычки-елочки (« »), дефисы между словами в тире (—), исправляет неразрывные пробелы и закрывает битые HTML-теги.
- Исключения для администраторов: В конфигурации плагина можно разрешить администраторам вставлять HTML-код напрямую в обход фильтрации Jevix (опция
use_for_admin = no).
Для поисковой оптимизации (SEO) предусмотрена генерация дружественных URL. Если при создании страницы заполнено поле «Алиас» (page_alias), ядро подставит его вместо числового ID в ЧПУ-ссылку (например, /news/my-article вместо /news/12). Кроме того, Seditio поддерживает полноценное управление SEO-параметрами страницы: ручное заполнение метатегов title (page_seo_title), description (page_seo_desc), keywords (page_seo_keywords) и отдельного заголовка H1 (page_seo_h1), который отображается на странице вместо стандартного page_title.
5.1.5. Экстраполя страниц
Если стандартных полей таблицы sed_pages (заголовок, текст, описание, дата) недостаточно, администратор может создать кастомные поля (экстраполя) с помощью конструктора словарей по адресу /admin/dic (или index.php?module=admin&m=dic при отключенном ЧПУ; подробнее см. Главе 3. Панель управления. Административная зона). Новые поля (например, цена page_price или ссылка на источник page_source) физически добавляются в таблицу sed_pages и выводятся в шаблоне page.tpl через соответствующие теги {PAGE_PRICE} и {PAGE_SOURCE}.
5.2. Модуль форумов (forums)
Модуль форумов представляет собой полноценную встроенную систему организации дискуссионных площадок. Весь код модуля расположен в каталоге modules/forums.
5.2.1. Структура разделов и неограниченная вложенность подфорумов
Архитектура форумов базируется на трех основных таблицах базы данных:
sed_forum_sections(Разделы форума): Хранит структуру категорий и веток форума.sed_forum_topics(Темы форума): Хранит заголовки тем, автора темы, дату создания и статистику просмотров/ответов.sed_forum_posts(Сообщения форума): Хранит физический текст сообщений пользователей.
Неограниченная вложенность подфорумов: Форумы в Seditio поддерживают выстраивание дерева разделов абсолютно любой глубины. Связывание дочерних категорий с родительскими осуществляется с помощью двух ключевых полей в таблице sed_forum_sections:
fs_id— уникальный числовой идентификатор ветки форума.fs_parentcat— идентификатор родительской ветки форума. Если ветка является корневым разделом, значениеfs_parentcatравно0. При создании подфорума в это поле записываетсяfs_idего родителя.
Ядро рекурсивно сканирует таблицу разделов при сборке дерева форумов, что позволяет выстраивать сложные многоуровневые структуры разделов без ограничений на вложенность.
5.2.2. Модерация и управление темами
Модераторам и администраторам, наделенным правами модерирования (бит Admin = 128 в ACL для соответствующей категории форума), доступен набор инструментов для контроля общения:
- Удаление тем и постов: Модератор может полностью удалить тему (
a=delete) или отдельный пост (a=delete). - Закрепление тем (
sticky): Закрепление темы наверху списка с флагом «Важно» (тема всегда отображается первой в разделе). - Закрытие тем (
lock): Блокировка темы для предотвращения добавления новых сообщений обычными пользователями. - Создание объявлений (
announcement): Перевод темы в статус объявления. - Подъем тем (
bump): Обновление даты последнего изменения темы для её перемещения наверх списка без добавления постов. - Приватные темы (
private): Сделать тему доступной для чтения только администраторам и создателю темы. - Перенос тем (
move): Перемещение всей ветки обсуждения со всеми постами в другую категорию форума с автоматическим пересчетом статистики сообщений в обоих разделах и возможностью оставить тему-призрак (ghost). - Сброс настроек темы (
clear/resetr): Сброс всех особых статусов темы и обнуление рейтинга постов. - Анти-бамп защита: Модуль форумов включает системную опцию защиты от спама Antibump (
antibumpforums). Если она активна, пользователи не могут отправлять несколько сообщений подряд в одной теме. Добавление второго сообщения подряд блокируется выводом предупреждения до тех пор, пока в тему не ответит другой пользователь.
5.2.3. Интеграция опросов на форуме
При создании темы на форуме пользователь (при наличии прав) может прикрепить к ней голосование (опрос). Логика работы опросов интегрирована с общим модулем опросов (polls). В БД создается опрос, привязанный к ID темы форума. Пользователи могут голосовать прямо внутри первого сообщения темы, а результаты отображаются в виде интерактивного графика процентного соотношения голосов.
5.3. Модуль пользователей (users)
Модуль пользователей управляет регистрацией новых аккаунтов, аутентификацией, личными кабинетами, выводом списков пользователей и модерированием их учетных записей. Весь программный код модуля сосредоточен в каталоге modules/users.
[!IMPORTANT]
Модуль
usersявляется залоченным системным модулем ядра (Lock_module = 1в файле конфигурацииmodules/users/users.setup.php), поэтому его невозможно отключить или удалить из системы.
[!NOTE]
Архитектура разграничения прав доступа (ACL), сессии, авторизация по кукам и защищенное двухфакторное хэширование паролей подробно описаны в Главе 4. Система пользователей и разграничение прав (ACL). Модуль
usersвыступает интерфейсной оболочкой над этими системными механизмами.
5.3.1. Основные компоненты и контроллеры модуля
Модуль разделен на несколько функциональных файлов-контроллеров, каждый из которых отвечает за свой участок логики:
- Вход и выход (
users.auth.php,users.logout.php):users.auth.phpотвечает за отображение формы авторизации (шаблонusers.auth.tpl) и обработку входящих POST-данных (логин/пароль). При успешной проверке создается сессия или кука автологина.users.logout.phpуничтожает сессию пользователя, удаляет персистентные куки авторизации и выполняет редирект на главную страницу.
- Регистрация (
users.register.php): Управляет созданием новых учетных записей на сайте. Выводит форму регистрации (users.register.tpl), проверяет уникальность e-mail и имени пользователя, валидирует данные. По умолчанию создает запись в таблицеsed_usersсо статусом «Неактивный» (Inactive), генерирует хэш активации и отправляет его на электронную почту. После перехода по ссылке статус меняется на «Участники» (Members). - Восстановление пароля (
users.passrecover.php): Реализует безопасный механизм сброса пароля. Если пользователь забыл пароль, контроллер генерирует временный секретный код сброса и отправляет ссылку на почту. При переходе генерируется новый случайный пароль, который высылается пользователю. - Личный кабинет (
users.profile.php): Позволяет авторизованному пользователю редактировать свои персональные данные: изменять e-mail, пароль, аватар (user_avatar), фотографию (user_photo), часовой пояс, язык интерфейса, тему оформления (скин) и заполнять кастомные поля (экстраполя). Данные выводятся и редактируются через шаблонusers.profile.tpl. - Просмотр карточки пользователя (
users.details.php): Контроллер отвечает за вывод публичной информации о любом зарегистрированном пользователе сайта (шаблонusers.details.tpl). Выводит дату регистрации, дату последнего визита, группу, а также статистику активности (количество созданных тем на форуме, написанных сообщений и страниц). - Список пользователей (
users.main.php): Выводит общую таблицу зарегистрированных пользователей сайта с постраничной навигацией. Поддерживает фильтрацию по первой букве имени, сортировку по различным колонкам таблицы БД (имя, ID, группа, дата регистрации) и поиск. Рендерится через шаблонusers.tpl. - Редактирование администратором (
users.edit.php): Интерфейс для модераторов и администраторов (с правами на редактирование пользователей). Позволяет изменять группу пользователя (в том числе основную группуuser_maingrp), активировать неактивные аккаунты, изменять любые профильные данные или полностью удалять пользователя с сайта. Шаблонusers.edit.tpl.
Возможность приостановки частей модуля: Ядро Seditio позволяет временно отключать (ставить на паузу) отдельные функциональные файлы-контроллеры модуля users с помощью встроенной функции sed_dieifdisabled_part(). Через административную панель управления можно отключить регистрацию (register), профили (profile), карточки деталей (details), списки пользователей (main) и даже выход (logout). Единственной неотключаемой частью является авторизация (auth) — проверка её состояния в коде отсутствует для гарантированного сохранения возможности входа администраторов на сайт.
5.4. Модуль Персональной Файловой Системы (pfs)
Модуль PFS (Personal File System) — это системный менеджер загрузки и хранения файлов пользователей. Он доступен как из личного кабинета, так и во время редактирования контента. Код модуля находится в каталоге modules/pfs.
5.4.1. PFS, иерархия папок и квоты дискового пространства
Все загружаемые файлы распределяются по папкам пользователей:
- Иерархическая структура папок: Таблица
sed_pfs_foldersхранит информацию о папках и альбомах пользователей. В системе поддерживается полноценная иерархия (вложенные папки). Каждая папка имеет уникальный ID, а связь с родительской папкой осуществляется через колонкуpff_parentid. Если папка находится в корне PFS пользователя, значениеpff_parentidравно0. При создании вложенной папки в это поле записывается ID родительской папки. Папки также разделяются по типам доступа на «Личные» и «Общие/Публичные» (pff_type). - В таблице
sed_pfsрегистрируются сами файлы (системное имя на сервере, оригинальное имя, размер, тип файла, дата загрузки, ID владельца). - Квоты и ограничения: В настройках групп пользователей (ACL) задаются жесткие лимиты дискового пространства. Каждой группе назначается максимальный суммарный объем загрузок (например, 50 МБ для обычных пользователей) и максимальный размер одного файла. При превышении квоты PFS заблокирует загрузку новых файлов до тех пор, пока пользователь не очистит свое хранилище.
5.4.2. Интеграция PFS в интерфейс CMS
PFS тесно интегрирован с текстовыми редакторами сайта (в первую очередь с CKEditor):
- При создании страницы или написании сообщения на форуме пользователь может открыть всплывающее окно PFS для выбора файлов.
- Во всплывающем окне PFS напротив каждой позиции файла выводятся специальные иконки быстрого действия для вставки контента в редактор:
- Полноразмерное изображение: Вставка картинки в исходном разрешении через HTML-тег
<img>. - Кликабельная миниатюра: Вставка уменьшенной копии изображения (
thumb) со ссылкой на оригинальный файл. - Ссылка на файл: Вставка обычной текстовой ссылки на скачивание или просмотр любого файла.
- Полноразмерное изображение: Вставка картинки в исходном разрешении через HTML-тег
5.5. Модуль Личных сообщений (pm)
Модуль pm обеспечивает защищенную внутреннюю переписку между зарегистрированными пользователями сайта без раскрытия их личных e-mail адресов. Код модуля находится в каталоге modules/pm.
5.5.1. Механизм отправки сообщений
- Переписка хранится в таблице
sed_pm. Каждое сообщение содержит ID отправителя (pm_fromuserid), ID получателя (pm_touserid), заголовок, текст, точную дату отправки и статус состоянияpm_state. - Состояния ЛС (
pm_state):0— Новое (непрочитанное) сообщение. Оно подсвечивается у получателя.1— Прочитанное сообщение.2— Сообщение перемещено в архив.
- Движок разделяет переписку на три виртуальные папки: «Входящие» (Inbox), «Исходящие» (Sentbox) и «Архив» (Archive).
5.5.2. Уведомления о новых сообщениях
- В шапке сайта (шаблон
header.tpl) с помощью глобального тега{HEADER_USER_PMREMINDER}выводится количество новых (непрочитанных) сообщений пользователя. Этот счетчик обновляется при каждой перезагрузке страницы.
5.6. Модуль Опросов (polls)
Модуль опросов предназначен для проведения социологических исследований и голосований среди посетителей сайта. Код модуля находится в каталоге modules/polls.
5.6.1. Управление опросами
- Все опросы хранятся в таблице
sed_polls(заголовок опроса, тип опроса, статус активности, дата создания, ID владельца опроса). - Варианты ответов хранятся в таблице
sed_polls_options(ID опроса, текст варианта ответа, количество набранных голосовpo_count). - Опросы могут быть двух типов:
- Глобальные: Выводятся в специальном блоке на главной странице сайта или в сайдбаре шаблона.
- Локальные: Прикрепляются к конкретным страницам (
page) или темам форума (forums).
5.6.2. Поддержка AJAX-голосования и защита от накрутки голосов
AJAX-голосование: Если в конфигурации включен AJAX ($cfg['ajax'] = true), отправка голоса происходит в фоновом режиме. Кнопка отправки формы получает JS-событие на вызов AJAX, которое передает параметр ajax=1 обработчику polls.main.php. Результаты опроса перерисовываются и обновляются в реальном времени внутри блока #pollajx без перезагрузки всей страницы.
Защита от накрутки голосов: Для предотвращения повторного голосования и фальсификации результатов Seditio выполняет проверку по базе данных (таблица sed_polls_voters):
- По ID пользователя: Для зарегистрированных пользователей проверяется наличие записи с их
pv_userid. - По IP-адресу: Для гостей и зарегистрированных пользователей проверяется совпадение IP-адреса (
pv_userip). Полеpv_useripимеет типVARCHAR(45)для полноценной поддержки как IPv4, так и IPv6-адресов.
Результаты рендерятся с помощью XTemplate в шаблоне polls.tpl, выводя процентное отношение голосов в виде цветных прогресс-баров.
5.7. Модуль Галереи (gallery)
Модуль галереи отвечает за структурирование и демонстрацию графического контента (фотоальбомов) на сайте. Уникальной архитектурной особенностью Seditio является то, что модуль Галереи не имеет собственных таблиц в базе данных и полностью базируется на Персональной Файловой Системе (PFS).
Код модуля находится в каталоге modules/gallery.
5.7.1. Архитектурная связь с PFS
- Использование таблиц PFS: Вместо выделенных таблиц галерея напрямую использует таблицы
sed_pfs_folders(для альбомов) иsed_pfs(для самих изображений). - Фильтрация по типу папки (
pff_type): Альбомом галереи считается папка PFS, у которой тип папки равен галерее (pff_type = '2'). В публичной галерее сайта (контроллерыgallery.main.php,gallery.browse.php) выводятся исключительно те папки пользователей, которые имеют эту метку. - Изображения как файлы PFS: Каждая фотография в альбоме — это запись в таблице
sed_pfs, привязанная к ID соответствующей папки-галереи через полеpfs_folderid.
5.7.2. Автоматическая обработка изображений
При загрузке файлов в папку типа «Галерея» система производит их обработку через встроенную библиотеку system/functions.image.php:
- Ресайз (Resize): Исходное изображение масштабируется под максимальные настройки ширины/высоты, заданные в конфигурации.
- Миниатюры (Thumbs): Автоматически генерируется уменьшенная копия изображения (
thumb) для быстрого вывода в списке альбома. - Кроп (Crop): Возможность кадрирования картинки под квадратный или заданный формат превью.
- Водяные знаки (Watermark): При включении данной опции на загружаемые фотографии накладывается полупрозрачный водяной знак (PNG-файл) для защиты авторских прав на изображения.
- Слайд-шоу: Вывод галереи настраивается в файле
gallery.tplс помощью специализированных тегов, выводящих пути к оригиналам картинок, превью, а также ссылки на слайд-шоу.
Comments: (0)