Глава 5. Встроенные модули (Core Modules)

07-07-26 10:24

В этой главе подробно рассматривается архитектура, внутреннее устройство, структура хранения данных и возможности семи ключевых встроенных модулей 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. Структура разделов и неограниченная вложенность подфорумов

Архитектура форумов базируется на трех основных таблицах базы данных:

  1. sed_forum_sections (Разделы форума): Хранит структуру категорий и веток форума.
  2. sed_forum_topics (Темы форума): Хранит заголовки тем, автора темы, дату создания и статистику просмотров/ответов.
  3. 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) со ссылкой на оригинальный файл.
    • Ссылка на файл: Вставка обычной текстовой ссылки на скачивание или просмотр любого файла.

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).
  • Опросы могут быть двух типов:
    1. Глобальные: Выводятся в специальном блоке на главной странице сайта или в сайдбаре шаблона.
    2. Локальные: Прикрепляются к конкретным страницам (page) или темам форума (forums).

5.6.2. Поддержка AJAX-голосования и защита от накрутки голосов

AJAX-голосование: Если в конфигурации включен AJAX ($cfg['ajax'] = true), отправка голоса происходит в фоновом режиме. Кнопка отправки формы получает JS-событие на вызов AJAX, которое передает параметр ajax=1 обработчику polls.main.php. Результаты опроса перерисовываются и обновляются в реальном времени внутри блока #pollajx без перезагрузки всей страницы.

Защита от накрутки голосов: Для предотвращения повторного голосования и фальсификации результатов Seditio выполняет проверку по базе данных (таблица sed_polls_voters):

  1. По ID пользователя: Для зарегистрированных пользователей проверяется наличие записи с их pv_userid.
  2. По 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 с помощью специализированных тегов, выводящих пути к оригиналам картинок, превью, а также ссылки на слайд-шоу.

Ratings:
(0.00)

No comments yet