Um artigo de nosso funcionário de seu blog pessoal.
O artigo trata da versão OpenCart> = 2.3, ou seja, 2.3 e 3.0 são considerados
O sistema de eventos no OpenCart é interessante o suficiente, não é uma lista predefinida de eventos. O interior do motor é organizado de tal forma que quase todos os métodos do controlador que respondem a uma determinada rota carregam alguns arquivos (outros controladores, modelos, visualizações, traduções).
O sistema de eventos OpenCart são eventos gerados antes e depois de carregar os arquivos do mecanismo / módulo.
Por exemplo, considere o controlador admin / controller / catalog / product.php no qual o método de índice será chamado no endereço /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 usa o carregamento do arquivo de tradução e o modelo de catálogo / produto, e você pode instalar seus próprios manipuladores que alteram os dados em ambos os fatos de carregamento.
Que eventos existem no OpenCart 2.3+?
Conforme definimos anteriormente, não existe uma lista predefinida de eventos. No entanto, os eventos esperados podem ser encontrados no arquivo system / engine / loader.php. $ this-> load é o objeto Loader.
Olhando através do arquivo, você pode ver que os eventos são gerados ($ this-> registro-> get ('evento') -> gatilho) ao carregar:
controladores
modelos
Visualizações
configs
traduções
. 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');
O sistema de eventos OpenCart é bastante interessante, permite muito e é flexível, mas não sem inconvenientes. O que é mais confuso é o fato de que para alterar a interface (visualizar eventos de carregamento), você precisa trabalhar manualmente com o DOM.
Para entender o conteúdo dos argumentos do evento, você precisa examinar o código-fonte dos arquivos carregados e, no caso das visualizações, também precisa examinar o controlador que passa os dados para essa visualização. No entanto, com o tempo, esse fato cresce de "desvantagem para dignidade", revelando a beleza do motor OpenCart.
Autor: Vitaly Buturlin