Архітектура XOOPS
Цей документ містить вичерпний огляд архітектури системи XOOPS, пояснюючи, як різні компоненти працюють разом для створення гнучкої та розширюваної системи керування вмістом.
XOOPS має модульну архітектуру, яка розділяє завдання на окремі рівні. Система побудована на кількох основних принципах:
- Модульність: функціональність організована в незалежні модулі, які можна встановити
- Розширюваність: систему можна розширити без зміни коду ядра
- Абстракція: рівні бази даних і презентації абстрагуються від бізнес-логіки
- Безпека: вбудовані механізми безпеки захищають від поширених вразливостей
Системні рівні
Section titled “Системні рівні”graph TB subgraph Presentation["🎨 Presentation Layer"] Themes["Themes"] Templates["Smarty Templates"] Blocks["Blocks"] end
subgraph Application["⚙️ Application Layer"] Modules["Modules"] Preloads["Preloads"] Controllers["Controllers"] BlockHandlers["Block Handlers"] end
subgraph Domain["📦 Domain Layer"] XoopsObject["XoopsObject"] Handlers["Object Handlers"] Criteria["Criteria System"] end
subgraph Infrastructure["🔧 Infrastructure Layer"] Database["XoopsDatabase"] Cache["Cache System"] Session["Session Manager"] Security["Security Layer"] end
Presentation --> Application Application --> Domain Domain --> Infrastructure
style Presentation fill:#e8f5e9,stroke:#388e3c style Application fill:#e3f2fd,stroke:#1976d2 style Domain fill:#fff3e0,stroke:#f57c00 style Infrastructure fill:#fce4ec,stroke:#c2185b1. Рівень презентації
Section titled “1. Рівень презентації”Презентаційний рівень обробляє візуалізацію інтерфейсу користувача за допомогою механізму шаблонів Smarty.
Ключові компоненти:
- Теми: візуальний стиль і макет
- Smarty Templates: динамічне відтворення вмісту
- Блоки: багаторазові віджети вмісту
2. Прикладний рівень
Section titled “2. Прикладний рівень”Прикладний рівень містить бізнес-логіку, контролери та функціональність модулів.
Ключові компоненти:
- Модулі: автономні функціональні пакети
- Обробники: класи обробки даних
- Попереднє завантаження: слухачі подій і перехоплювачі
3. Доменний рівень
Section titled “3. Доменний рівень”Рівень домену містить основні бізнес-об’єкти та правила.
Ключові компоненти:
- XoopsObject: базовий клас для всіх об’єктів домену
- Обробники: операції CRUD для об’єктів домену
4. Рівень інфраструктури
Section titled “4. Рівень інфраструктури”Рівень інфраструктури надає основні послуги, такі як доступ до бази даних і кешування.
Життєвий цикл запиту
Section titled “Життєвий цикл запиту”Розуміння життєвого циклу запиту має вирішальне значення для ефективної розробки XOOPS.
XOOPS 2.5.x Потік контролера сторінки
Section titled “XOOPS 2.5.x Потік контролера сторінки”Поточна версія XOOPS 2.5.x використовує шаблон контролера сторінки, де кожен файл PHP обробляє власний запит. Глобальні значення ($xoopsDB, $xoopsUser, $xoopsTpl тощо) ініціалізуються під час завантаження та доступні під час виконання.
sequenceDiagram participant Browser participant Entry as modules/mymod/index.php participant Main as mainfile.php participant Kernel as XOOPS Kernel participant DB as $xoopsDB participant User as $xoopsUser participant Handler as MyObjectHandler participant Tpl as $xoopsTpl (Smarty) participant Theme
Browser->>Entry: GET /modules/mymod/index.php
rect rgb(240, 248, 255) Note over Entry,User: Bootstrap Phase (mainfile.php) Entry->>Main: include mainfile.php Main->>Kernel: Initialize Core Kernel->>DB: Create XoopsDatabase (singleton) Kernel->>User: Load Session → $xoopsUser Kernel->>Tpl: Initialize Smarty → $xoopsTpl Main-->>Entry: Globals Ready end
rect rgb(255, 250, 240) Note over Entry,Handler: Page Controller Execution Entry->>Handler: xoops_getModuleHandler('myobject') Handler->>DB: query via Criteria DB-->>Handler: Result Set Handler-->>Entry: XoopsObject[] end
rect rgb(240, 255, 240) Note over Entry,Theme: Rendering Phase Entry->>Tpl: $xoopsTpl->assign('items', $objects) Entry->>Theme: include header.php Entry->>Tpl: $xoopsTpl->display('mymod_index.tpl') Entry->>Theme: include footer.php Theme-->>Browser: Complete HTML Page endКлючові глобальні параметри в 2.5.x
Section titled “Ключові глобальні параметри в 2.5.x”| Глобальний | Тип | Ініціалізовано | Призначення |
|---|---|---|---|
$xoopsDB | XoopsDatabase | Bootstrap | Підключення до бази даних (singleton) |
$xoopsUser | XoopsUser|null | Сеансове навантаження | Поточний авторизований користувач |
$xoopsTpl | XoopsTpl | Ініціалізація шаблону | Механізм шаблонів Smarty |
$xoopsModule | XoopsModule | Навантаження модуля | Поточний контекст модуля |
$xoopsConfig | array | Завантаження конфігурації | Конфігурація системи |
:::нота[XOOPS 4.0 Порівняння] У XOOPS 4.0 шаблон Page Controller замінено на PSR-15 Middleware Pipeline і диспетчеризацію на основі маршрутизатора. Глобальні значення замінено впровадженням залежностей. Перегляньте Договір про гібридний режим, щоб отримати гарантії сумісності під час міграції. :::
1. Фаза початкового завантаження
Section titled “1. Фаза початкового завантаження”// mainfile.php is the entry pointinclude_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization$xoops = Xoops::getInstance();$xoops->boot();Кроки:
- Конфігурація завантаження (
mainfile.php) - Ініціалізація автозавантажувача
- Налаштуйте обробку помилок
- Встановіть підключення до бази даних
- Завантажити сеанс користувача
- Ініціалізуйте систему шаблонів Smarty
2. Фаза маршрутизації
Section titled “2. Фаза маршрутизації”// Request routing to appropriate module$module = $GLOBALS['xoopsModule'];$controller = $module->getController();$controller->dispatch($request);Кроки:
- Проаналізуйте запит URL
- Визначте цільовий модуль
- Завантажте конфігурацію модуля
- Перевірте дозволи
- Маршрут до відповідного обробника
3. Етап виконання
Section titled “3. Етап виконання”// Controller execution$data = $handler->getObjects($criteria);$xoopsTpl->assign('items', $data);Кроки:
- Виконайте логіку контролера
- Взаємодія з рівнем даних
- Правила ведення бізнесу
- Підготуйте дані перегляду
4. Фаза візуалізації
Section titled “4. Фаза візуалізації”// Template renderinginclude XOOPS_ROOT_PATH . '/header.php';$xoopsTpl->display('db:module_template.tpl');include XOOPS_ROOT_PATH . '/footer.php';Кроки:
- Застосуйте макет теми
- Шаблон модуля візуалізації
- Блоки процесу
- Вихідна відповідь
Основні компоненти
Section titled “Основні компоненти”XoopsObject
Section titled “XoopsObject”Базовий клас для всіх об’єктів даних у XOOPS.
<?phpclass MyModuleItem extends XoopsObject{ public function __construct() { $this->initVar('id', XOBJ_DTYPE_INT, null, false); $this->initVar('title', XOBJ_DTYPE_TXTBOX, '', true, 255); $this->initVar('content', XOBJ_DTYPE_TXTAREA, '', false); $this->initVar('created', XOBJ_DTYPE_INT, time(), false); }}Ключові методи:
initVar()- Визначити властивості об’єктаgetVar()- Отримати значення властивостейsetVar()- Встановити значення властивостейassignVars()- Масове призначення з масиву
XoopsPersistableObjectHandler
Section titled “XoopsPersistableObjectHandler”Обробляє операції CRUD для екземплярів XoopsObject.
<?phpclass MyModuleItemHandler extends XoopsPersistableObjectHandler{ public function __construct(\XoopsDatabase $db) { parent::__construct($db, 'mymodule_items', 'MyModuleItem', 'id', 'title'); }
public function getActiveItems($limit = 10) { $criteria = new CriteriaCompo(); $criteria->add(new Criteria('status', 1)); $criteria->setSort('created'); $criteria->setOrder('DESC'); $criteria->setLimit($limit);
return $this->getObjects($criteria); }}Ключові методи:
create()- Створення нового екземпляра об’єктаget()- Отримати об’єкт за ідентифікаторомinsert()- Зберегти об’єкт до бази данихdelete()- Видалити об’єкт з бази данихgetObjects()- Отримання кількох об’єктівgetCount()- Підрахунок відповідних об’єктів
Структура модуля
Section titled “Структура модуля”Кожен модуль XOOPS має стандартну структуру каталогу:
modules/mymodule/├── class/ # PHP classes│ ├── MyModuleItem.php│ └── MyModuleItemHandler.php├── include/ # Include files│ ├── common.php│ └── functions.php├── templates/ # Smarty templates│ ├── mymodule_index.tpl│ └── mymodule_item.tpl├── admin/ # Admin area│ ├── index.php│ └── menu.php├── language/ # Translations│ └── english/│ ├── main.php│ └── modinfo.php├── sql/ # Database schema│ └── mysql.sql├── xoops_version.php # Module info├── index.php # Module entry└── header.php # Module headerКонтейнер ін’єкції залежностей
Section titled “Контейнер ін’єкції залежностей”Сучасна розробка XOOPS може використовувати впровадження залежностей для кращої тестованості.
Реалізація базового контейнера
Section titled “Реалізація базового контейнера”<?phpclass XoopsDependencyContainer{ private array $services = [];
public function register(string $name, callable $factory): void { $this->services[$name] = $factory; }
public function resolve(string $name): mixed { if (!isset($this->services[$name])) { throw new \InvalidArgumentException("Service not found: $name"); }
$factory = $this->services[$name];
if (is_callable($factory)) { return $factory($this); }
return $factory; }
public function has(string $name): bool { return isset($this->services[$name]); }}PSR-11 Сумісний контейнер
Section titled “PSR-11 Сумісний контейнер”<?phpnamespace Xmf\Di;
use Psr\Container\ContainerInterface;
class BasicContainer implements ContainerInterface{ protected array $definitions = [];
public function set(string $id, mixed $value): void { $this->definitions[$id] = $value; }
public function get(string $id): mixed { if (!$this->has($id)) { throw new \InvalidArgumentException("Service not found: $id"); }
$entry = $this->definitions[$id];
if (is_callable($entry)) { return $entry($this); }
return $entry; }
public function has(string $id): bool { return isset($this->definitions[$id]); }}Приклад використання
Section titled “Приклад використання”<?php// Service registration$container = new XoopsDependencyContainer();
$container->register('database', function () { return XoopsDatabaseFactory::getDatabaseConnection();});
$container->register('userHandler', function ($c) { return new XoopsUserHandler($c->resolve('database'));});
// Service resolution$userHandler = $container->resolve('userHandler');$user = $userHandler->get($userId);Точки розширення
Section titled “Точки розширення”XOOPS надає кілька механізмів розширення:
1. Попереднє завантаження
Section titled “1. Попереднє завантаження”Попередні завантаження дозволяють модулям підключатися до основних подій.
<?phpclass MymoduleCorePreload extends XoopsPreloadItem{ public static function eventCoreHeaderEnd($args) { // Execute when header processing ends }
public static function eventCoreFooterStart($args) { // Execute when footer processing starts }}2. Плагіни
Section titled “2. Плагіни”Плагіни розширюють певну функціональність модулів.
<?phpclass MymoduleNotifyPlugin{ public function onItemCreate($item) { // Send notification when item is created }}3. Фільтри
Section titled “3. Фільтри”Фільтри змінюють дані, коли вони проходять через систему.
<?php// Content filter example$myts = MyTextSanitizer::getInstance();$content = $myts->displayTarea($rawContent, 1, 1, 1);Найкращі практики
Section titled “Найкращі практики”Організація коду
Section titled “Організація коду”- Використовуйте простори імен для нового коду:
namespace XoopsModules\MyModule;
class Item extends \XoopsObject { // Implementation }- Дотримуйтеся автозавантаження PSR-4:
{ "autoload": { "psr-4": { "XoopsModules\\MyModule\\": "class/" } } }- Окремі проблеми:
— Логіка домену в
class/- Презентація в
templates/— Контролери в корені модуля
- Презентація в
Продуктивність
Section titled “Продуктивність”- Використовуйте кешування для дорогих операцій
- Відкладене завантаження ресурсів, коли це можливо
- Зведіть до мінімуму запити до бази даних за допомогою групування критеріїв
- Оптимізуйте шаблони, уникаючи складної логіки
Безпека
Section titled “Безпека”- Перевірте всі введені дані за допомогою
Xmf\Request - Вивід екранування в шаблонах
- Використовуйте підготовлені оператори для запитів до бази даних
- Перевірте дозволи перед конфіденційними операціями
Пов’язана документація
Section titled “Пов’язана документація”- Design-Patterns - Шаблони дизайну, що використовуються в XOOPS
- Рівень бази даних - Деталі абстракції бази даних
- Основи Smarty - Документація системи шаблонів
- Рекомендації щодо безпеки - Правила безпеки
#xoops #architecture #core #design #system-design