Événements dans OpenCart

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





Une source








All Articles