Ereignisse in OpenCart

Ein Artikel unseres Mitarbeiters aus seinem persönlichen Blog.









Der Artikel befasst sich mit OpenCart Version> = 2.3, dh 2.3 und 3.0 werden berücksichtigt





Das Ereignissystem in OpenCart ist interessant genug, es ist keine vordefinierte Liste von Ereignissen. Das Innere des Motors ist so angeordnet, dass fast jede Methode der Steuerung, die auf eine bestimmte Route reagiert, einige Dateien lädt (andere Steuerungen, Modelle, Ansichten, Übersetzungen).





Das OpenCart-Ereignissystem generiert Ereignisse vor und nach dem Laden der Engine- / Moduldateien.





Betrachten Sie beispielsweise den Controller admin / controller / catalog / product.php, in dem die Indexmethode unter der Adresse /admin/index.php?route=catalog/product aufgerufen wird:





public function index() {
    $this->load->language('catalog/product');
 
    $this->document->setTitle($this->language->get('heading_title'));
 
    $this->load->model('catalog/product');
 
    $this->getList();
}
      
      



Diese Methode verwendet das Laden der Übersetzungsdatei und des Katalog- / Produktmodells. Sie können Ihre eigenen Handler installieren, die die Daten für beide Ladefakten ändern.





Welche Ereignisse gibt es in OpenCart 2.3+?





Wie wir zuvor definiert haben, gibt es keine vordefinierte Liste von Ereignissen. Die erwarteten Ereignisse finden Sie jedoch in der Datei system / engine / loader.php. $ this-> load ist das Loader-Objekt.





Wenn Sie sich die Datei ansehen, sehen Sie, dass beim Laden Ereignisse generiert werden ($ this-> registry-> get ('event') -> trigger):





  • Steuerungen





  • Modelle





  • Ansichten





  • Konfigurationen





  • Übersetzungen





. 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');
      
      







Das OpenCart-Ereignissystem ist sehr interessant, es erlaubt viel und ist flexibel, aber nicht ohne Nachteile. Am verwirrendsten ist die Tatsache, dass Sie zum Ändern der Benutzeroberfläche (Anzeigen von Ladeereignissen) manuell mit dem DOM arbeiten müssen.





Um den Inhalt der Ereignisargumente zu verstehen, müssen Sie den Quellcode der geladenen Dateien untersuchen. Bei Ansichten müssen Sie auch den Controller untersuchen, der Daten an diese Ansicht übergibt. Mit der Zeit wächst diese Tatsache jedoch von "Nachteil zu Würde" und zeigt die Schönheit der OpenCart-Engine.









Verfasser: Vitaly Buturlin





Eine Quelle








All Articles