Un artículo de nuestro empleado de su blog personal.
El artículo trata sobre la versión OpenCart> = 2.3, es decir, se consideran 2.3 y 3.0
El sistema de eventos en OpenCart es bastante interesante, no es una lista predefinida de eventos. El interior del motor está dispuesto de tal manera que casi todos los métodos del controlador que responden a una determinada ruta cargan algunos archivos (otros controladores, modelos, vistas, traducciones).
El sistema de eventos OpenCart se genera eventos antes y después de cargar los archivos del módulo / motor.
Por ejemplo, considere el controlador admin / controller / catalog / product.php en el que se llamará al método de índice en la dirección /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();
}
Este método utiliza la carga del archivo de traducción y el modelo de catálogo / producto, y puede instalar sus propios controladores que cambian los datos en ambos hechos de carga.
¿Qué eventos hay en OpenCart 2.3+?
Como definimos anteriormente, no existe una lista predefinida de eventos. Sin embargo, los eventos esperados se pueden encontrar en el archivo system / engine / loader.php. $ this-> load es el objeto Loader.
Al mirar el archivo, puede ver que se generan eventos ($ this-> registro-> get ('evento') -> disparador) al cargar:
controladores
modelos
puntos de vista
configs
traducciones
. 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');
El sistema de eventos OpenCart es bastante interesante, permite mucho y es flexible, pero no exento de inconvenientes. Lo más confuso es el hecho de que para cambiar la interfaz (ver eventos de carga), debe trabajar manualmente con el DOM.
Para comprender el contenido de los argumentos del evento, debe examinar el código fuente de los archivos cargados y, en el caso de las vistas, también debe examinar el controlador que pasa datos a esa vista. Sin embargo, con el tiempo, este hecho pasa de "la desventaja a la dignidad", revelando la belleza del motor OpenCart.
Autor: Vitaly Buturlin