Μετάβαση στο περιεχόμενο

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

Το επίπεδο παρουσίασης χειρίζεται την απόδοση της διεπαφής χρήστη χρησιμοποιώντας τη μηχανή προτύπων Smarty.

Βασικά συστατικά:

  • Θέματα: Οπτικό στυλ και διάταξη
  • Smarty Templates: Δυναμική απόδοση περιεχομένου
  • Μπλοκ: Επαναχρησιμοποιήσιμα γραφικά στοιχεία περιεχομένου

Το επίπεδο εφαρμογής περιέχει επιχειρηματική λογική, ελεγκτές και λειτουργικότητα μονάδας.

Βασικά συστατικά:

  • Ενότητες: Αυτοτελή πακέτα λειτουργιών
  • Handlers: Κατηγορίες χειρισμού δεδομένων
  • Προφορτώσεις: Ακροατές εκδηλώσεων και αγκίστρια

Το επίπεδο τομέα περιέχει βασικά επιχειρηματικά αντικείμενα και κανόνες.

Βασικά συστατικά:

  • XoopsObject: Βασική κλάση για όλα τα αντικείμενα τομέα
  • Handlers: CRUD λειτουργίες για αντικείμενα τομέα

Το επίπεδο υποδομής παρέχει βασικές υπηρεσίες, όπως πρόσβαση στη βάση δεδομένων και προσωρινή αποθήκευση.

Η κατανόηση του κύκλου ζωής του αιτήματος είναι ζωτικής σημασίας για την αποτελεσματική ανάπτυξη του XOOPS.

Το τρέχον 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
ΠαγκόσμιαΤύποςΑρχικοποιήθηκεΣκοπός
$xoopsDB XoopsDatabaseBootstrapΣύνδεση βάσης δεδομένων (singleton)
$xoopsUser XoopsUser|nullΦόρτωση συνεδρίαςΤρέχων συνδεδεμένος χρήστης
$xoopsTpl XoopsTplΠρότυπο initΈξυπνη μηχανή προτύπων
$xoopsModule XoopsModuleΦορτίο μονάδαςΤρέχον πλαίσιο ενότητας
$xoopsConfig arrayΦόρτωση διαμόρφωσηςΔιαμόρφωση συστήματος

:::σημείωση[XOOPS 4.0 Σύγκριση] Στο XOOPS 4.0, το μοτίβο του Ελεγκτή σελίδας αντικαθίσταται από PSR-15 Middleware Pipeline και αποστολή που βασίζεται σε δρομολογητή. Τα παγκόσμια αντικαθίστανται με ένεση εξάρτησης. Ανατρέξτε στο Hybrid Mode Contract για εγγυήσεις συμβατότητας κατά τη μετεγκατάσταση. :::

// mainfile.php is the entry point
include_once XOOPS_ROOT_PATH . '/mainfile.php';
// Core initialization
$xoops = Xoops::getInstance();
$xoops->boot();

Βήματα:

  1. Διαμόρφωση φορτίου (mainfile.php)
  2. Εκκινήστε την αυτόματη φόρτωση
  3. Ρυθμίστε τη διαχείριση σφαλμάτων
  4. Δημιουργήστε σύνδεση βάσης δεδομένων
  5. Φόρτωση συνεδρίας χρήστη
  6. Αρχικοποιήστε τη μηχανή προτύπων Smarty
// Request routing to appropriate module
$module = $GLOBALS['xoopsModule'];
$controller = $module->getController();
$controller->dispatch($request);

Βήματα:

  1. Ανάλυση αιτήματος URL
  2. Προσδιορίστε τη μονάδα προορισμού
  3. Φορτώστε τη διαμόρφωση της μονάδας
  4. Ελέγξτε τα δικαιώματα
  5. Περάστε στον κατάλληλο χειριστή
// Controller execution
$data = $handler->getObjects($criteria);
$xoopsTpl->assign('items', $data);

Βήματα:

  1. Εκτελέστε τη λογική του ελεγκτή
  2. Αλληλεπίδραση με το επίπεδο δεδομένων
  3. Επεξεργαστείτε τους επιχειρηματικούς κανόνες
  4. Προετοιμάστε δεδομένα προβολής
// Template rendering
include XOOPS_ROOT_PATH . '/header.php';
$xoopsTpl->display('db:module_template.tpl');
include XOOPS_ROOT_PATH . '/footer.php';

Βήματα:

  1. Εφαρμογή διάταξης θέματος
  2. Render module template
  3. Μπλοκ διεργασιών
  4. Απόκριση εξόδου

Η βασική κλάση για όλα τα αντικείμενα δεδομένων στο XOOPS.

<?php
class 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() - Μαζική ανάθεση από πίνακα

Χειρίζεται λειτουργίες CRUD για παρουσίες XoopsObject.

<?php
class 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 μπορεί να αξιοποιήσει την έγχυση εξάρτησης για καλύτερη δυνατότητα δοκιμής.

<?php
class 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]);
}
}
<?php
namespace 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 παρέχει διάφορους μηχανισμούς επέκτασης:

Οι προφορτώσεις επιτρέπουν στις ενότητες να συνδεθούν με βασικά συμβάντα.

modules/mymodule/preloads/core.php
<?php
class MymoduleCorePreload extends XoopsPreloadItem
{
public static function eventCoreHeaderEnd($args)
{
// Execute when header processing ends
}
public static function eventCoreFooterStart($args)
{
// Execute when footer processing starts
}
}

Τα πρόσθετα επεκτείνουν συγκεκριμένες λειτουργίες εντός των μονάδων.

modules/mymodule/plugins/notify.php
<?php
class MymoduleNotifyPlugin
{
public function onItemCreate($item)
{
// Send notification when item is created
}
}

Τα φίλτρα τροποποιούν τα δεδομένα καθώς περνούν μέσα από το σύστημα.

<?php
// Content filter example
$myts = MyTextSanitizer::getInstance();
$content = $myts->displayTarea($rawContent, 1, 1, 1);
  1. Χρησιμοποιήστε χώρους ονομάτων για νέο κωδικό:
namespace XoopsModules\MyModule;
class Item extends \XoopsObject
{
// Implementation
}
  1. Ακολουθήστε PSR-4 αυτόματη φόρτωση:
{
"autoload": {
"psr-4": {
"XoopsModules\\MyModule\\": "class/"
}
}
}
  1. Ξεχωριστές ανησυχίες:
    • Λογική τομέα σε class/
    • Παρουσίαση στο templates/
    • Ελεγκτές στη ρίζα της μονάδας
  1. Χρησιμοποιήστε προσωρινή αποθήκευση για ακριβές λειτουργίες
  2. Τεμπέλης φόρτωση πόρων όταν είναι δυνατόν
  3. Ελαχιστοποιήστε τα ερωτήματα της βάσης δεδομένων χρησιμοποιώντας ομαδοποίηση κριτηρίων
  4. Βελτιστοποιήστε τα πρότυπα αποφεύγοντας τη σύνθετη λογική
  1. Επικυρώστε όλες τις εισόδους χρησιμοποιώντας το XMF\Request
  2. Εξόδου διαφυγής σε πρότυπα
  3. Χρησιμοποιήστε έτοιμες δηλώσεις για ερωτήματα βάσης δεδομένων
  4. Ελέγξτε τα δικαιώματα πριν από ευαίσθητες λειτουργίες