Ein Artikel unseres Mitarbeiters aus seinem persönlichen Blog.
Der Artikel befasst sich mit OpenCart Version> = 2.3, dh 2.3 und 3.0 werden berücksichtigt
Das Ereignissystem in OpenCart ist interessant genug, es ist keine vordefinierte Liste von Ereignissen. Das Innere des Motors ist so angeordnet, dass fast jede Methode der Steuerung, die auf eine bestimmte Route reagiert, einige Dateien lädt (andere Steuerungen, Modelle, Ansichten, Übersetzungen).
Das OpenCart-Ereignissystem generiert Ereignisse vor und nach dem Laden der Engine- / Moduldateien.
Betrachten Sie beispielsweise den Controller admin / controller / catalog / product.php, in dem die Indexmethode unter der Adresse /admin/index.php?route=catalog/product aufgerufen wird:
public function index() {
$this->load->language('catalog/product');
$this->document->setTitle($this->language->get('heading_title'));
$this->load->model('catalog/product');
$this->getList();
}
Diese Methode verwendet das Laden der Übersetzungsdatei und des Katalog- / Produktmodells. Sie können Ihre eigenen Handler installieren, die die Daten für beide Ladefakten ändern.
Welche Ereignisse gibt es in OpenCart 2.3+?
Wie wir zuvor definiert haben, gibt es keine vordefinierte Liste von Ereignissen. Die erwarteten Ereignisse finden Sie jedoch in der Datei system / engine / loader.php. $ this-> load ist das Loader-Objekt.
Wenn Sie sich die Datei ansehen, sehen Sie, dass beim Laden Ereignisse generiert werden ($ this-> registry-> get ('event') -> trigger):
Steuerungen
Modelle
Ansichten
Konfigurationen
Übersetzungen
. OpenCart MVCl , 4 , , / . MVCl :
Model - , , admin/model catalog/model
View - , /, admin/view catalog/view
Controller - ( , ), admin/controller catalog/controller
language - , admin/language catalog/language
( ) :
before -
after -
, ( , ) .
, , , ajax , startup/router
, get route
action
( route).
, startup/router
$this-> load
, before
, , null
, after
(c admin/controller/startup/router.php
OpenCart 3.0):
// Trigger the pre events
$result = $this->event->trigger('controller/' . $route . '/before', array(&$route, &$data));
if (!is_null($result)) {
return $result;
}
// We dont want to use the loader class as it would make an controller callable.
$action = new Action($route);
// Any output needs to be another Action object.
$output = $action->execute($this->registry);
// Trigger the post events
$result = $this->event->trigger('controller/' . $route . '/after', array(&$route, &$data, &$output));
if (!is_null($result)) {
return $result;
}
return $output;
,
OpenCart 2.3+ before after .
.
before null, , , null. after null . ( //):
public function controller($route, $data = array()) {
// Sanitize the call
$route = preg_replace('/[^a-zA-Z0-9_\/]/', '', (string)$route);
// Keep the original trigger
$trigger = $route;
file_put_contents($_SERVER['DOCUMENT_ROOT']."/loader-controller.txt", $trigger."\n", FILE_APPEND);
// Trigger the pre events
$result = $this->registry->get('event')->trigger('controller/' . $trigger . '/before', array(&$route, &$data));
// Make sure its only the last event that returns an output if required.
if ($result != null && !$result instanceof Exception) {
$output = $result;
} else {
$action = new Action($route);
$output = $action->execute($this->registry, array(&$data));
}
// Trigger the post events
$result = $this->registry->get('event')->trigger('controller/' . $trigger . '/after', array(&$route, &$data, &$output));
if ($result && !$result instanceof Exception) {
$output = $result;
}
if (!$output instanceof Exception) {
return $output;
}
}
before
after
, .
system/engine/event.php Event::trigger
: - ( before
after
) null, ( before
after
).
(, , , ) .
, . MVCl :
before : &$route &$data
after : &$route, &$data &$output
( system/engine/loader.php):
&$route , controller|view|model|language before|after, , catalog/model/checkout/order/addOrderHistory/after &$route checkout/order/addOrderHistory
&$data ( ), , tpl/twig
&$output ( , ), ,
&$data tpl/twig . &$output , &$data . &$data before , . .
&$output after , Simple Html DOM.
&$data before , !
OpenCart
php system/config/admin.php system/config/catalog.php $_['action_event'], , . , , * " ". " ".
OpenCart 3.0 ( , ) "" .
( ) event:
event_id - ()
code - , ,
trigger - , , admin/view/catalog/product_form/after -
action - , extension/module/productmarkedfield/eventProductFormAfter
status - (1/0)
sort_order - ( )
:
( install)
( uninstall)
, , !
, OpenCart 2.3 extension/event, OpenCart 3.0 setting/event.
, $sort_order ( event OpenCart 3.0):
public function addEvent($code, $trigger, $action, $status = 1, $sort_order = 0) {
$this->db->query("INSERT INTO `" . DB_PREFIX . "event` SET `code` = '" . $this->db->escape($code) . "', `trigger` = '" . $this->db->escape($trigger) . "', `action` = '" . $this->db->escape($action) . "', `sort_order` = '" . (int)$sort_order . "', `status` = '" . (int)$status . "'");
return $this->db->getLastId();
}
, .
:
code - ,
trigger - , admin/view/catalog/product_form/after
action - , , extension/module/productmarkedfield/eventProductFormAfter , , ,
"Controller" . $sRelPath . $sFileName
sRelPath , sFileName . ControllerExtensionModuleProductmarkedfield
status - /,
sort_order - (OpenCart 3.0), , , 0
trigger action. trigger () ( ) admin catalog, action , admin catalog. ,
trigger - admin/view/catalog/product_form/after, action - extension/module/productmarkedfield/eventProductFormAfter, admin/controller/extension/module/productmarkedfield.php ControllerExtensionModuleProductmarkedfield::eventProductFormAfter
trigger - catalog/model/checkout/order/addOrderHistory/after, action - extension/module/productmarkedfield/eventaddOrderHistoryAfter, catalog/controller/extension/module/productmarkedfield.php ControllerExtensionModuleProductmarkedfield::eventaddOrderHistoryAfter
OpenCart 2.3 :
$this->load->model('extension/event');
// " " - ( )
$this->model_extension_event->addEvent(
'productmarkedfield', //
'admin/view/catalog/product_form/after', //
'extension/module/productmarkedfield/eventProductFormAfter' //
OpenCart 3.0 :
$this->load->model('setting/event');
// " " - ( )
$this->model_setting_event->addEvent(
'productmarkedfield',
'admin/view/catalog/product_form/after',
'extension/module/productmarkedfield/eventProductFormAfter'
, !
. system/engine/action.php Action::execute
action
Exception
:
$reflection = new ReflectionClass($class);
if ($reflection->hasMethod($this->method) && $reflection->getMethod($this->method)->getNumberOfRequiredParameters() <= count($args)) {
return call_user_func_array(array($controller, $this->method), $args);
} else {
return new \Exception('Error: Could not call ' . $this->route . '/' . $this->method . '!');
}
.
OpenCart 2.3 extension/event
deleteEvent
( OpenCart 2.3):
public function deleteEvent($code) {
$this->db->query("DELETE FROM `" . DB_PREFIX . "event` WHERE `code` = '" . $this->db->escape($code) . "'");
}
OpenCart 3.0 . deleteEvent
, deleteEventByCode
, deleteEvent
OpenCart 2.3 ( OpenCart 3.0):
public function deleteEvent($event_id) {
$this->db->query("DELETE FROM `" . DB_PREFIX . "event` WHERE `event_id` = '" . (int)$event_id . "'");
}
public function deleteEventByCode($code) {
$this->db->query("DELETE FROM `" . DB_PREFIX . "event` WHERE `code` = '" . $this->db->escape($code) . "'");
}
OpenCart 2.3 :
$this->load->model('extension/event');
$this->model_extension_event->deleteEvent('productmarkedfield');
OpenCart 3.0:
$this->load->model('setting/event');
$this->model_setting_event->deleteEvent('productmarkedfield');
Das OpenCart-Ereignissystem ist sehr interessant, es erlaubt viel und ist flexibel, aber nicht ohne Nachteile. Am verwirrendsten ist die Tatsache, dass Sie zum Ändern der Benutzeroberfläche (Anzeigen von Ladeereignissen) manuell mit dem DOM arbeiten müssen.
Um den Inhalt der Ereignisargumente zu verstehen, müssen Sie den Quellcode der geladenen Dateien untersuchen. Bei Ansichten müssen Sie auch den Controller untersuchen, der Daten an diese Ansicht übergibt. Mit der Zeit wächst diese Tatsache jedoch von "Nachteil zu Würde" und zeigt die Schönheit der OpenCart-Engine.
Verfasser: Vitaly Buturlin