OpenCartのイベント

従業員の個人ブログからの記事。









この記事では、OpenCartバージョン> = 2.3を扱っています。つまり、2.3と3.0が考慮されています。





OpenCartのイベントシステムは十分に興味深いものであり、事前定義されたイベントのリストではありません。エンジンの内部は、特定のルートに応答するほとんどすべてのコントローラーメソッドがいくつかのファイル(他のコントローラー、モデル、ビュー、変換)をロードするように配置されています。





OpenCartイベントシステムは、エンジン/モジュールファイルのロードの前後にイベントを生成します。





たとえば、アドレス/admin/index.php?route=catalog/productでindexメソッドが呼び出されるコントローラーadmin / controller / catalog /product.phpについて考えてみます。





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



この方法では、翻訳ファイルとカタログ/製品モデルの読み込みを使用し、両方の読み込みファクトのデータを変更する独自のハンドラーをインストールできます。





OpenCart 2.3以降にはどのようなイベントがありますか?





前に定義したように、事前定義されたイベントのリストはありません。ただし、予期されるイベントは、system / engine /loader.phpファイルにあります。$ this-> loadはLoaderオブジェクトです。





ファイルを見ると、ロード時にイベントが生成されていることがわかります($ this-> Registry-> get( 'event')-> trigger)。





  • コントローラー





  • モデル





  • ビュー





  • 構成





  • 翻訳





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







OpenCartイベントシステムは非常に興味深いものであり、多くのことを可能にし、柔軟性がありますが、欠点がないわけではありません。最も紛らわしいのは、インターフェイスを変更する(ロードイベントを表示する)には、手動でDOMを操作する必要があるという事実です。





イベント引数の内容を理解するには、ロードされたファイルのソースコードを調べる必要があります。ビューの場合は、そのビューにデータを渡すコントローラーも調べる必要があります。しかし、時間の経過とともに、この事実は「不利から尊厳へ」と成長し、OpenCartエンジンの美しさを明らかにします。









著者:Vitaly Buturlin





ソース








All Articles