Eventos en OpenCart

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





Una fuente








All Articles