XOOPS arhitektura
O ovom dokumentu
Ova stranica opisuje konceptualnu arhitekturu XOOPS koja se odnosi na trenutnu (2.5.x) i buduću (4.0.x) verziju. Neki dijagrami prikazuju slojevitu viziju dizajna.
Za detalje specifične za verziju:
- XOOPS 2.5.x danas: koristi
mainfile.php, globalne vrijednosti ($xoopsDB,$xoopsUser), predučitavanja i obrazac rukovatelja - XOOPS 4.0 Target: PSR-15 middleware, DI spremnik, usmjerivač - pogledajte Roadmap
Ovaj dokument pruža sveobuhvatan pregled arhitekture sustava XOOPS, objašnjavajući kako različite komponente rade zajedno kako bi stvorile fleksibilan i proširiv sustav upravljanja sadržajem.
Pregled
Section titled “Pregled”XOOPS slijedi modularnu arhitekturu koja odvaja probleme u različite slojeve. Sustav je izgrađen oko nekoliko temeljnih načela:
- Modularnost: Funkcionalnost je organizirana u nezavisne, instalirajuće modules
- Proširivost: Sustav se može proširiti bez modificiranja osnovnog koda
- Apstrakcija: Slojevi baze podataka i prezentacije su apstrahirani od poslovne logike
- Sigurnost: Ugrađeni sigurnosni mehanizmi štite od uobičajenih ranjivosti
Slojevi sustava
Section titled “Slojevi sustava”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. Prezentacijski sloj
Section titled “1. Prezentacijski sloj”Prezentacijski sloj upravlja iscrtavanjem korisničkog sučelja pomoću mehanizma predložaka Smarty.
Ključne komponente:
- teme: Vizualni stil i izgled
- Smarty predlošci: Dinamičko prikazivanje sadržaja
- Blokovi: widgeti sadržaja za višekratnu upotrebu
2. Aplikacijski sloj
Section titled “2. Aplikacijski sloj”Aplikacijski sloj sadrži poslovnu logiku, kontrolere i funkcionalnost modula.
Ključne komponente:
- moduli: Samostalni funkcionalni paketi
- Rukovatelji: Manipulacija podacima classes
- Preloads: Slušatelji događaja i kuke
3. Sloj domene
Section titled “3. Sloj domene”Sloj domene sadrži osnovne poslovne objekte i pravila.
Ključne komponente:
- XoopsObject: Baza class za sve objekte domene
- Rukovatelji: CRUD operacije za objekte domene
4. Infrastrukturni sloj
Section titled “4. Infrastrukturni sloj”Infrastrukturni sloj pruža osnovne usluge kao što su pristup bazi podataka i predmemorija.
Životni ciklus zahtjeva
Section titled “Životni ciklus zahtjeva”Razumijevanje životnog ciklusa zahtjeva ključno je za učinkovit razvoj XOOPS.
XOOPS 2.5.x Protok kontrolera stranice
Section titled “XOOPS 2.5.x Protok kontrolera stranice”Trenutačni XOOPS 2.5.x koristi obrazac Page Controller gdje svaka datoteka PHP obrađuje vlastiti zahtjev. Globalni ($xoopsDB, $xoopsUser, $xoopsTpl, itd.) se inicijaliziraju tijekom pokretanja i dostupni su tijekom cijelog izvođenja.
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 endKljučni globali u 2.5.x
Section titled “Ključni globali u 2.5.x”| Globalno | Upišite | Inicijalizirano | Svrha |
|---|---|---|---|
$xoopsDB | XoopsDatabase | Bootstrap | Veza s bazom podataka (singleton) |
$xoopsUser | XoopsUser|null | Opterećenje sesije | Trenutačni prijavljeni korisnik |
$xoopsTpl | XoopsTpl | Pokretanje predloška | Smarty mehanizam predloška |
$xoopsModule | XoopsModule | Opterećenje modula | Trenutni kontekst modula |
$xoopsConfig | array | Učitavanje konfiguracije | Konfiguracija sustava |
| U XOOPS 4.0, obrazac kontrolera stranice zamijenjen je PSR-15 cjevovodom srednjeg softvera i slanjem temeljenim na usmjerivaču. Globali su zamijenjeni ubrizgavanjem ovisnosti. Pogledajte Ugovor o hibridnom načinu rada za jamstva kompatibilnosti tijekom migracije. | |||
| ::: |
1. Bootstrap faza
Section titled “1. Bootstrap faza”// mainfile.php is the entry pointinclude_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization$xoops = Xoops::getInstance();$xoops->boot();Koraci:
- Konfiguracija opterećenja (
mainfile.php) - Inicijalizirajte autoloader
- Postavite obradu grešaka
- Uspostavite vezu s bazom podataka
- Učitaj korisničku sesiju
- Inicijalizirajte mehanizam predložaka Smarty
2. Faza usmjeravanja
Section titled “2. Faza usmjeravanja”// Request routing to appropriate module$module = $GLOBALS['xoopsModule'];$controller = $module->getController();$controller->dispatch($request);Koraci:
- Raščlanite zahtjev URL
- Identificirajte ciljni modul
- Učitajte konfiguraciju modula
- Provjerite dopuštenja
- Usmjerite do odgovarajućeg rukovatelja
3. Faza izvršenja
Section titled “3. Faza izvršenja”// Controller execution$data = $handler->getObjects($criteria);$xoopsTpl->assign('items', $data);Koraci:
- Izvršite logiku upravljača
- Interakcija s podatkovnim slojem
- Procesna poslovna pravila
- Pripremite podatke o pregledu
4. Faza iscrtavanja
Section titled “4. Faza iscrtavanja”// Template renderinginclude XOOPS_ROOT_PATH . '/header.php';$xoopsTpl->display('db:module_template.tpl');include XOOPS_ROOT_PATH . '/footer.php';Koraci:
- Primijenite izgled teme
- predložak modula za prikaz
- Procesni blokovi
- Izlazni odgovor
Osnovne komponente
Section titled “Osnovne komponente”XoopsObject
Section titled “XoopsObject”Baza class za sve podatkovne objekte u 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); }}Ključne metode:
initVar()- Definirajte svojstva objektagetVar()- Dohvaćanje vrijednosti svojstavasetVar()- Postavite vrijednosti svojstavaassignVars()- Skupno dodjeljivanje iz polja
XoopsPersistableObjectHandler
Section titled “XoopsPersistableObjectHandler”Rukuje operacijama CRUD za instance 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); }}Ključne metode:
create()- Stvorite novu instancu objektaget()- Dohvaćanje objekta prema ID-uinsert()- Spremi objekt u bazu podatakadelete()- Ukloni objekt iz baze podatakagetObjects()- Dohvaćanje više objekatagetCount()- Broji podudarne objekte
Struktura modula
Section titled “Struktura modula”Svaki XOOPS modul slijedi standardnu strukturu direktorija:
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 headerSpremnik za ubacivanje ovisnosti
Section titled “Spremnik za ubacivanje ovisnosti”Moderni razvoj XOOPS može iskoristiti ubrizgavanje ovisnosti za bolju mogućnost testiranja.
Implementacija osnovnog spremnika
Section titled “Implementacija osnovnog spremnika”<?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 kompatibilan spremnik
Section titled “PSR-11 kompatibilan spremnik”<?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]); }}Primjer upotrebe
Section titled “Primjer upotrebe”<?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);Extension Points
Section titled “Extension Points”XOOPS nudi nekoliko mehanizama produljenja:
1. Prethodno učitavanje
Section titled “1. Prethodno učitavanje”Predučitavanja omogućuju modules da se spoji na osnovne događaje.
<?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. Dodaci
Section titled “2. Dodaci”Dodaci proširuju specifične funkcije unutar modules.
<?phpclass MymoduleNotifyPlugin{ public function onItemCreate($item) { // Send notification when item is created }}3. Filtri
Section titled “3. Filtri”Filtri mijenjaju podatke dok prolaze kroz sustav.
<?php// Content filter example$myts = MyTextSanitizer::getInstance();$content = $myts->displayTarea($rawContent, 1, 1, 1);Najbolji primjeri iz prakse
Section titled “Najbolji primjeri iz prakse”Organizacija koda
Section titled “Organizacija koda”-
Koristite imenske prostore za novi kod:
namespace XoopsModules\MyModule;class Item extends \XoopsObject{// Implementation} -
Slijedite PSR-4 automatsko učitavanje:
{"autoload": {"psr-4": {"XoopsModules\\MyModule\\": "class/"}}} -
Odvojene brige:
- Logika domene u
class/ - Prezentacija u
templates/ - Kontroleri u korijenu modula
- Logika domene u
Izvedba1. Koristite predmemoriranje za skupe operacije
Section titled “Izvedba1. Koristite predmemoriranje za skupe operacije”- Lijeno učitavanje resursa kada je to moguće
- Minimizirajte upite baze podataka korištenjem grupiranja kriterija
- Optimizirajte templates izbjegavajući složenu logiku
Sigurnost
Section titled “Sigurnost”- Potvrdite sav unos pomoću
Xmf\Request - Escape izlaz u templates
- Koristite pripremljene izjave za upite baze podataka
- Provjerite dopuštenja prije osjetljivih operacija
Povezana dokumentacija
Section titled “Povezana dokumentacija”- Design-Patterns - Dizajn uzorci korišteni u XOOPS
- Sloj baze podataka - Detalji apstrakcije baze podataka
- Smarty Osnove - predložak dokumentacije sustava
- Najbolje sigurnosne prakse - Sigurnosne smjernice
#xoops #arhitektura #core #design #system-design