Artikel oleh karyawan kami dari blog pribadinya.
Artikel berkaitan dengan OpenCart versi> = 2.3, yaitu 2.3 dan 3.0 dianggap
Sistem acara di OpenCart cukup menarik, ini bukan daftar acara yang telah ditentukan sebelumnya. Bagian dalam mesin diatur sedemikian rupa sehingga hampir setiap metode pengontrol yang merespons rute tertentu memuat beberapa file (pengontrol lain, model, tampilan, terjemahan).
Sistem peristiwa OpenCart menghasilkan peristiwa sebelum dan setelah memuat file mesin / modul.
Misalnya, perhatikan kontroler admin / controller / catalog / product.php di mana metode indeks akan dipanggil di alamat /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();
}
Metode ini menggunakan pemuatan file terjemahan dan katalog / model produk, dan Anda dapat menginstal penangan Anda sendiri yang mengubah data pada kedua fakta pemuatan.
Acara apa yang ada di OpenCart 2.3+?
Seperti yang kita tentukan sebelumnya, tidak ada daftar peristiwa yang telah ditentukan sebelumnya. Namun, kejadian yang diharapkan dapat ditemukan di file system / engine / loader.php. $ this-> load adalah objek Loader.
Melihat file tersebut, Anda dapat melihat bahwa peristiwa dibuat ($ this-> registry-> get ('event') -> trigger) saat memuat:
pengendali
model
tampilan
konfigurasi
terjemahan
. 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');
Sistem acara OpenCart cukup menarik, memungkinkan banyak dan fleksibel, tetapi bukan tanpa kekurangan. Yang paling membingungkan adalah kenyataan bahwa untuk mengubah antarmuka (melihat peristiwa pemuatan), Anda perlu bekerja dengan DOM secara manual.
Untuk memahami konten argumen peristiwa, Anda perlu memeriksa kode sumber dari file yang dimuat, dan dalam kasus tampilan, Anda juga perlu memeriksa pengontrol yang meneruskan data ke tampilan tersebut. Namun, seiring waktu, fakta ini tumbuh dari "kerugian menjadi martabat" yang mengungkapkan keindahan mesin OpenCart.
Penulis: Vitaly Buturlin