身為模組開發人員,您通常需要在日常 OpenCart 自訂模組開發中建立自訂架構。與其他框架一樣,它已經以 OpenCart 模組架構中不同鉤子的形式進行了配置。
在我們繼續探索上述鉤子之前,讓我們先探討一下 OpenCart 中擴充的概念。從上往下看,它是OpenCart中的一個擴展,可以讓你豐富OpenCart的核心功能。透過安裝它,您可以為前端商店添加功能,無論是簡單的圖像庫還是一些外觀精美的拖放功能。
此外,擴充功能根據其提供的功能被分類為邏輯群組。舉個簡單的例子,支付擴展在前端結帳中添加了新的支付方式,同時它是一個反詐欺擴展,允許您檢測商店中的垃圾郵件活動。前往後端並查看擴充選單下的列表,其中顯示了 OpenCart 支援的不同類型的擴充功能。
您會驚訝地發現模組也只是 OpenCart 中的另一個擴充。每個擴充都是圍繞著 OpenCart 生態系統中事物應如何運作的通用工作流程建構的。掛鉤可讓您根據特定事件執行某些操作,無論是在模組啟動期間運行安裝掛鉤還是在卸載期間清理垃圾。
本文將討論這些安裝和卸載掛鉤。雖然它們將在模組的上下文中進行討論,但我沒有看到任何阻止您將相同的方法也應用於其他類型的擴充功能的內容,因此請隨意自行探索這些文件。
這是 OpenCart 的最新版本,提供了本教學中的片段。截至撰寫本文時,它是 2.1.0.2 穩定版本。
在本節中,我們將探討安裝掛鉤的具體用途。繼續並在您喜歡的文字編輯器中開啟 admin/controller/extension/module.php
,然後找到 install
方法。它應該看起來像這樣:
<?php ... public function install() { $this->load->language('extension/module'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('extension/extension'); $this->load->model('extension/module'); if ($this->validate()) { $this->model_extension_extension->install('module', $this->request->get['extension']); $this->load->model('user/user_group'); $this->model_user_user_group->addPermission($this->user->getGroupId(), 'access', 'module/' . $this->request->get['extension']); $this->model_user_user_group->addPermission($this->user->getGroupId(), 'modify', 'module/' . $this->request->get['extension']); // Call install method if it exists $this->load->controller('module/' . $this->request->get['extension'] . '/install'); $this->session->data['success'] = $this->language->get('text_success'); $this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } $this->getList(); } ... ?>
這是模組的通用安裝鉤子,每當您嘗試從後端安裝任何模組時都會呼叫該鉤子。讓我們來看看這個方法的重要部分。
首先,它會載入後續活動所需的模型檔案。 $this->model_extension_extension->install
方法呼叫可確保將此特定模組的項目新增至資料庫。
接下來是一些 ACL 內容,它是透過呼叫 addPermission
方法來完成的。它確保當前用戶 admin 應該能夠存取模組特定的設定並更改它們。
最後,它呼叫正在安裝的模組的 install
方法。不要與我們已經使用的 install 方法混淆 - 它會呼叫模組特定的 install
方法(如果存在)。
例如,如果您嘗試安裝使用 PayPal 登入模組,它將呼叫檔案 admin/controller/module 中定義的安裝方法/pp_login.php
如下所示。
<?php ... public function install() { $this->load->model('extension/event'); $this->model_extension_event->addEvent('pp_login', 'post.customer.logout', 'module/pp_login/logout'); } ... ?>
自 OpenCart 2.x 推出以來,包含了一些令人興奮的功能,事件觀察器就是其中之一。它允許您添加特定於模組的事件,其他模組可以為此事件設定觀察者,以便在觸發該特定事件時它們可以運行一些任意程式碼。這正是上述安裝方法中演示的內容,該方法添加了 post.customer.logout
自訂事件!
就使用 PayPal 登入模組來說,這是非常簡單的東西,但有時如果您希望注入自訂架構或類似的東西,您將需要更多。讓我們從 PayPal Express Checkout 付款擴充功能中引入我們的安裝方法。繼續開啟 admin/controller/ payment/pp_express.php
。
<?php ... public function install() { $this->load->model('payment/pp_express'); $this->model_payment_pp_express->install(); } ... ?>
首先,它會載入對應的模型文件,並使用該文件呼叫模型的 install
方法。根據經驗,每當您想要操作模式時,都應該在模型的安裝方法中實作該程式碼,而不是直接將其放入控制器的安裝方法中。
現在,讓我們快速拉入模型檔案 admin/model/ payment/pp_express.php
中定義的 install 方法。
<?php ... public function install() { $this->db->query(" CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_order` ( `paypal_order_id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `capture_status` ENUM('Complete','NotComplete') DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `authorization_id` VARCHAR(30) NOT NULL, `total` DECIMAL( 10, 2 ) NOT NULL, PRIMARY KEY (`paypal_order_id`) ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); $this->db->query(" CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_order_transaction` ( `paypal_order_transaction_id` int(11) NOT NULL AUTO_INCREMENT, `paypal_order_id` int(11) NOT NULL, `transaction_id` CHAR(20) NOT NULL, `parent_transaction_id` CHAR(20) NOT NULL, `date_added` DATETIME NOT NULL, `note` VARCHAR(255) NOT NULL, `msgsubid` CHAR(38) NOT NULL, `receipt_id` CHAR(20) NOT NULL, `payment_type` ENUM('none','echeck','instant', 'refund', 'void') DEFAULT NULL, `payment_status` CHAR(20) NOT NULL, `pending_reason` CHAR(50) NOT NULL, `transaction_entity` CHAR(50) NOT NULL, `amount` DECIMAL( 10, 2 ) NOT NULL, `debug_data` TEXT NOT NULL, `call_data` TEXT NOT NULL, PRIMARY KEY (`paypal_order_transaction_id`) ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); } ... ?>
終於有值得慶幸的事情了!如您所見,使用 OpenCart 的資料庫 API 建立了幾個自訂 MySQL 表。因此,這是使用模型的 install 方法應用資料庫相關變更的方法。
所以,就安裝掛鉤而言,這就是了。我希望它不像乍看那麼複雜。讓我們這樣說吧。這個過程透過觸發特定於擴充功能的安裝方法開始,該方法依次呼叫正在安裝的擴充功能的安裝方法(如果存在)。最後,如果該擴充功能需要任何資料庫操作,則從控制器的安裝方法呼叫模型的安裝方法。
本节与上一节相对应,重点介绍卸载挂钩中发生的情况。我们将按照与上一节中的 install 方法相同的方式进行操作,因此让我们立即从文件 admin/ 中获取 <code class="inline">uninstall
挂钩的代码控制器/扩展/module.php。
<?php ... public function uninstall() { $this->load->language('extension/module'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('extension/extension'); $this->load->model('extension/module'); if ($this->validate()) { $this->model_extension_extension->uninstall('module', $this->request->get['extension']); $this->model_extension_module->deleteModulesByCode($this->request->get['extension']); $this->load->model('setting/setting'); $this->model_setting_setting->deleteSetting($this->request->get['extension']); // Call uninstall method if it exists $this->load->controller('module/' . $this->request->get['extension'] . '/uninstall'); $this->session->data['success'] = $this->language->get('text_success'); $this->response->redirect($this->url->link('extension/module', 'token=' . $this->session->data['token'], 'SSL')); } $this->getList(); } ... ?>
同样,它看起来应该有点熟悉,因为其中大部分是样板代码。首先的重要代码片段是调用 uninstall
方法,该方法从 扩展 MySQL 表中删除当前正在卸载的扩展的条目。
接下来,它调用 deleteModulesByCode
,这会删除与扩展关联的模块。这是一种特殊方法,只能在这种模块类型的扩展中找到 - 您不会在其他扩展中找到它,例如付款、运输、欺诈等。
原因是您可以复制每个模块来创建多个实例。例如,您可以在不同的页面上显示不同的横幅模块。另一方面,复制其他类型的扩展没有任何意义。再次举个例子,前端的 PayPal 付款扩展只需要一个实例。
接下来,它通过调用 deleteSetting
方法删除与该模块相关的配置变量。最后,它调用正在卸载的模块的 uninstall
方法。
让我们打开 admin/controller/module/pp_login.php
看看卸载方法是什么样的。
<?php ... public function uninstall() { $this->load->model('extension/event'); $this->model_extension_event->deleteEvent('pp_login'); } ... ?>
很简单吧?它只是撤消注入到使用 PayPal 登录模块的安装方法中的内容。回想一下,我们在安装过程中创建了一个新事件 post.customer.logout,因此显然我们需要在卸载过程中删除它,以确保我们不会留下任何特定于模块的垃圾。 p>
此外,我们还可以快速了解一下 PayPal Express Checkout 付款扩展程序的卸载方法,就像我们在前面部分中介绍的安装方法一样。获取 admin/controller/ payment/pp_express.
的以下片段。
<?php ... public function uninstall() { $this->load->model('payment/pp_express'); $this->model_payment_pp_express->uninstall(); } ... ?>
完全符合预期——它加载模型并调用卸载方法。这也给了我们打开模型文件 admin/model/ payment/pp_express.php
并探索卸载方法的充分理由。
<?php ... public function uninstall() { $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_order_transaction`;"); $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_order`;"); } ... ?>
我们只是删除之前创建的 MySQL 表,因为我们不希望有人问我们,“你怎么能留下这些垃圾?”
所以,这就是 OpenCart 中安装和卸载挂钩的故事,希望不错。下一部分也是最后一部分快速总结了迄今为止在一个简单但有效的自定义模块中学到的概念,因为这在你的小猫后理论课程中是一件很好的事情。
在本节中,我们将创建一个管理模块演示,除了在安装期间创建新架构并在卸载期间删除它之外,该模块不会做太多事情。
首先,让我们创建一个语言文件,以便在后端拾取该模块。继续创建一个包含以下内容的文件 admin/language/english/module/demo.php
。
<?php // Heading $_['heading_title'] = 'Demo Module';
接下来,我们需要创建一个模型文件来保存自定义模块的实际且有趣的代码。模型文件应放置在 admin/model/module/demo.php
。它在 install
方法中创建一个演示 MySQL 表,并将其放入 uninstall
方法中。
<?php class ModelModuleDemo extends Model { public function install() { $this->db->query(" CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "demo` ( `demo_id` int(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, PRIMARY KEY (`demo_id`) ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci;"); } public function uninstall() { $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "demo`;"); } }
最后,继续创建一个包含以下内容的控制器文件 admin/controller/module/demo.php
。
<?php class ControllerModuleDemo extends Controller { public function install() { $this->load->model('module/demo'); $this->model_module_demo->install(); } public function uninstall() { $this->load->model('module/demo'); $this->model_module_demo->uninstall(); } }
它应该很简单 - 它加载模型并根据正在执行的操作调用相应的方法。
来吧,尝试一下。它应该在扩展 > 模块下列为演示模块。安装它,你应该会看到后端创建的 demo MySQL 表,当然不要忘记卸载它以删除该表。
今天,我们讨论了 OpenCart 安装过程的一个重要方面,即安装和卸载挂钩。我们详细介绍了这些挂钩,并在本文的后面部分构建了一个简单的模块作为概念证明。
当然,欢迎提问和评论!
以上是OpenCart:如何設定和刪除掛鉤的詳細內容。更多資訊請關注PHP中文網其他相關文章!