XOOPS Αρχιτεκτονική
Αυτό το έγγραφο παρέχει μια ολοκληρωμένη επισκόπηση της αρχιτεκτονικής του συστήματος XOOPS, εξηγώντας πώς συνεργάζονται τα διάφορα στοιχεία για τη δημιουργία ενός ευέλικτου και επεκτάσιμου συστήματος διαχείρισης περιεχομένου.
Επισκόπηση
Ενότητα με τίτλο «Επισκόπηση»Το XOOPS ακολουθεί μια αρθρωτή αρχιτεκτονική που διαχωρίζει τις ανησυχίες σε διακριτά επίπεδα. Το σύστημα βασίζεται σε πολλές βασικές αρχές:
- Modularity: Η λειτουργικότητα είναι οργανωμένη σε ανεξάρτητες μονάδες που μπορούν να εγκατασταθούν
- Επεκτασιμότητα: Το σύστημα μπορεί να επεκταθεί χωρίς τροποποίηση του βασικού κώδικα
- Αφαίρεση: Τα επίπεδα βάσης δεδομένων και παρουσίασης αφαιρούνται από την επιχειρηματική λογική
- Ασφάλεια: Οι ενσωματωμένοι μηχανισμοί ασφαλείας προστατεύουν από κοινά τρωτά σημεία
Επίπεδα συστήματος
Ενότητα με τίτλο «Επίπεδα συστήματος»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:#c2185b# 1. Επίπεδο παρουσίασης
Ενότητα με τίτλο «# 1. Επίπεδο παρουσίασης»Το επίπεδο παρουσίασης χειρίζεται την απόδοση της διεπαφής χρήστη χρησιμοποιώντας τη μηχανή προτύπων Smarty.
Βασικά συστατικά:
- Θέματα: Οπτικό στυλ και διάταξη
- Smarty Templates: Δυναμική απόδοση περιεχομένου
- Μπλοκ: Επαναχρησιμοποιήσιμα γραφικά στοιχεία περιεχομένου
# 2. Επίπεδο εφαρμογής
Ενότητα με τίτλο «# 2. Επίπεδο εφαρμογής»Το επίπεδο εφαρμογής περιέχει επιχειρηματική λογική, ελεγκτές και λειτουργικότητα μονάδας.
Βασικά συστατικά:
- Ενότητες: Αυτοτελή πακέτα λειτουργιών
- Handlers: Κατηγορίες χειρισμού δεδομένων
- Προφορτώσεις: Ακροατές εκδηλώσεων και αγκίστρια
# 3. Επίπεδο τομέα
Ενότητα με τίτλο «# 3. Επίπεδο τομέα»Το επίπεδο τομέα περιέχει βασικά επιχειρηματικά αντικείμενα και κανόνες.
Βασικά συστατικά:
- XoopsObject: Βασική κλάση για όλα τα αντικείμενα τομέα
- Handlers: CRUD λειτουργίες για αντικείμενα τομέα
# 4. Επίπεδο υποδομής
Ενότητα με τίτλο «# 4. Επίπεδο υποδομής»Το επίπεδο υποδομής παρέχει βασικές υπηρεσίες, όπως πρόσβαση στη βάση δεδομένων και προσωρινή αποθήκευση.
Αίτημα Κύκλου Ζωής
Ενότητα με τίτλο «Αίτημα Κύκλου Ζωής»Η κατανόηση του κύκλου ζωής του αιτήματος είναι ζωτικής σημασίας για την αποτελεσματική ανάπτυξη του XOOPS.
# XOOPS 2.5.x Ροή ελεγκτή σελίδας
Ενότητα με τίτλο «# XOOPS 2.5.x Ροή ελεγκτή σελίδας»Το τρέχον XOOPS 2.5.x χρησιμοποιεί ένα μοτίβο Page Controller όπου κάθε αρχείο 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
Ενότητα με τίτλο «# Βασικά παγκόσμια σε 2.5.x»| Παγκόσμια | Τύπος | Αρχικοποιήθηκε | Σκοπός |
|---|---|---|---|
$xoopsDB | XoopsDatabase | Bootstrap | Σύνδεση βάσης δεδομένων (singleton) |
$xoopsUser | XoopsUser|null | Φόρτωση συνεδρίας | Τρέχων συνδεδεμένος χρήστης |
$xoopsTpl | XoopsTpl | Πρότυπο init | Έξυπνη μηχανή προτύπων |
$xoopsModule | XoopsModule | Φορτίο μονάδας | Τρέχον πλαίσιο ενότητας |
$xoopsConfig | array | Φόρτωση διαμόρφωσης | Διαμόρφωση συστήματος |
:::σημείωση[XOOPS 4.0 Σύγκριση] Στο XOOPS 4.0, το μοτίβο του Ελεγκτή σελίδας αντικαθίσταται από PSR-15 Middleware Pipeline και αποστολή που βασίζεται σε δρομολογητή. Τα παγκόσμια αντικαθίστανται με ένεση εξάρτησης. Ανατρέξτε στο Hybrid Mode Contract για εγγυήσεις συμβατότητας κατά τη μετεγκατάσταση. :::
# 1. Φάση εκκίνησης
Ενότητα με τίτλο «# 1. Φάση εκκίνησης»// mainfile.php is the entry pointinclude_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization$xoops = Xoops::getInstance();$xoops->boot();Βήματα:
- Διαμόρφωση φορτίου (
mainfile.php) - Εκκινήστε την αυτόματη φόρτωση
- Ρυθμίστε τη διαχείριση σφαλμάτων
- Δημιουργήστε σύνδεση βάσης δεδομένων
- Φόρτωση συνεδρίας χρήστη
- Αρχικοποιήστε τη μηχανή προτύπων Smarty
# 2. Φάση δρομολόγησης
Ενότητα με τίτλο «# 2. Φάση δρομολόγησης»// Request routing to appropriate module$module = $GLOBALS['xoopsModule'];$controller = $module->getController();$controller->dispatch($request);Βήματα:
- Ανάλυση αιτήματος URL
- Προσδιορίστε τη μονάδα προορισμού
- Φορτώστε τη διαμόρφωση της μονάδας
- Ελέγξτε τα δικαιώματα
- Περάστε στον κατάλληλο χειριστή
# 3. Φάση εκτέλεσης
Ενότητα με τίτλο «# 3. Φάση εκτέλεσης»// Controller execution$data = $handler->getObjects($criteria);$xoopsTpl->assign('items', $data);Βήματα:
- Εκτελέστε τη λογική του ελεγκτή
- Αλληλεπίδραση με το επίπεδο δεδομένων
- Επεξεργαστείτε τους επιχειρηματικούς κανόνες
- Προετοιμάστε δεδομένα προβολής
# 4. Φάση απόδοσης
Ενότητα με τίτλο «# 4. Φάση απόδοσης»// Template renderinginclude XOOPS_ROOT_PATH . '/header.php';$xoopsTpl->display('db:module_template.tpl');include XOOPS_ROOT_PATH . '/footer.php';Βήματα:
- Εφαρμογή διάταξης θέματος
- Render module template
- Μπλοκ διεργασιών
- Απόκριση εξόδου
Βασικά εξαρτήματα
Ενότητα με τίτλο «Βασικά εξαρτήματα»# XoopsObject
Ενότητα με τίτλο «# 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
Ενότητα με τίτλο «# 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()- Καταμέτρηση αντικειμένων που ταιριάζουν
# Δομή ενότητας
Ενότητα με τίτλο «# Δομή ενότητας»Κάθε ενότητα 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Δοχείο έγχυσης εξάρτησης
Ενότητα με τίτλο «Δοχείο έγχυσης εξάρτησης»Η σύγχρονη ανάπτυξη XOOPS μπορεί να αξιοποιήσει την έγχυση εξάρτησης για καλύτερη δυνατότητα δοκιμής.
# Βασική υλοποίηση κοντέινερ
Ενότητα με τίτλο «# Βασική υλοποίηση κοντέινερ»<?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 Συμβατό δοχείο
Ενότητα με τίτλο «# 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]); }}# Παράδειγμα χρήσης
Ενότητα με τίτλο «# Παράδειγμα χρήσης»<?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);Σημεία επέκτασης
Ενότητα με τίτλο «Σημεία επέκτασης»Το XOOPS παρέχει διάφορους μηχανισμούς επέκτασης:
# 1. Προφορτώσεις
Ενότητα με τίτλο «# 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. Πρόσθετα
Ενότητα με τίτλο «# 2. Πρόσθετα»Τα πρόσθετα επεκτείνουν συγκεκριμένες λειτουργίες εντός των μονάδων.
<?phpclass MymoduleNotifyPlugin{ public function onItemCreate($item) { // Send notification when item is created }}# 3. Φίλτρα
Ενότητα με τίτλο «# 3. Φίλτρα»Τα φίλτρα τροποποιούν τα δεδομένα καθώς περνούν μέσα από το σύστημα.
<?php// Content filter example$myts = MyTextSanitizer::getInstance();$content = $myts->displayTarea($rawContent, 1, 1, 1);Βέλτιστες πρακτικές
Ενότητα με τίτλο «Βέλτιστες πρακτικές»# Οργανισμός κώδικα
Ενότητα με τίτλο «# Οργανισμός κώδικα»- Χρησιμοποιήστε χώρους ονομάτων για νέο κωδικό:
namespace XoopsModules\MyModule;
class Item extends \XoopsObject { // Implementation }- Ακολουθήστε PSR-4 αυτόματη φόρτωση:
{ "autoload": { "psr-4": { "XoopsModules\\MyModule\\": "class/" } } }- Ξεχωριστές ανησυχίες:
- Λογική τομέα σε
class/ - Παρουσίαση στο
templates/ - Ελεγκτές στη ρίζα της μονάδας
- Λογική τομέα σε
# Απόδοση
Ενότητα με τίτλο «# Απόδοση»- Χρησιμοποιήστε προσωρινή αποθήκευση για ακριβές λειτουργίες
- Τεμπέλης φόρτωση πόρων όταν είναι δυνατόν
- Ελαχιστοποιήστε τα ερωτήματα της βάσης δεδομένων χρησιμοποιώντας ομαδοποίηση κριτηρίων
- Βελτιστοποιήστε τα πρότυπα αποφεύγοντας τη σύνθετη λογική
# Ασφάλεια
Ενότητα με τίτλο «# Ασφάλεια»- Επικυρώστε όλες τις εισόδους χρησιμοποιώντας το
XMF\Request - Εξόδου διαφυγής σε πρότυπα
- Χρησιμοποιήστε έτοιμες δηλώσεις για ερωτήματα βάσης δεδομένων
- Ελέγξτε τα δικαιώματα πριν από ευαίσθητες λειτουργίες
Σχετική τεκμηρίωση
Ενότητα με τίτλο «Σχετική τεκμηρίωση»- Design-Patterns - Σχεδιαστικά μοτίβα που χρησιμοποιούνται στο XOOPS
- Επίπεδο βάσης δεδομένων - Λεπτομέρειες αφαίρεσης βάσης δεδομένων
- Smarty Basics - Τεκμηρίωση συστήματος προτύπων
- Βέλτιστες πρακτικές ασφαλείας - Οδηγίες ασφαλείας