Un article de notre employé tiré de son blog personnel.
L'article traite de la version OpenCart> = 2.3, à savoir 2.3 et 3.0 sont considérés
Le système d'événements d'OpenCart est assez intéressant, ce n'est pas une liste d'événements prédéfinie. L'intérieur du moteur est agencé de telle manière que presque chaque méthode du contrôleur qui répond à une certaine route charge certains fichiers (autres contrôleurs, modèles, vues, traductions).
Le système d'événements OpenCart est généré des événements avant et après le chargement des fichiers moteur / module.
Par exemple, considérons le contrôleur admin / controller / catalog / product.php dans lequel la méthode d'index sera appelée à l'adresse /admin/index.php?route=catalog/product:
public function index() {
$this->load->language('catalog/product');
$this->document->setTitle($this->language->get('heading_title'));
$this->load->model('catalog/product');
$this->getList();
}
Cette méthode utilise le chargement du fichier de traduction et du modèle de catalogue / produit, et vous pouvez installer vos propres gestionnaires qui modifient les données sur les deux faits de chargement.
Quels événements existe-t-il dans OpenCart 2.3+?
Comme nous l'avons défini précédemment, il n'y a pas de liste d'événements prédéfinie. Cependant, les événements attendus se trouvent dans le fichier system / engine / loader.php. $ this-> load est l'objet Loader.
En regardant le fichier, vous pouvez voir que des événements sont générés ($ this-> registry-> get ('event') -> trigger) lors du chargement:
contrôleurs
des modèles
vues
configs
traductions
. 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');
Le système d'événements OpenCart est assez intéressant, il permet beaucoup et est flexible, mais non sans inconvénients. Le plus déroutant est le fait que pour changer l'interface (afficher les événements de chargement), vous devez travailler manuellement avec le DOM.
Pour comprendre le contenu des arguments d'événement, vous devez examiner le code source des fichiers chargés et, dans le cas des vues, vous devez également examiner le contrôleur qui transmet les données à cette vue. Cependant, au fil du temps, ce fait passe du «désavantage à la dignité» révélant la beauté du moteur OpenCart.
Auteur: Vitaly Buturlin