目錄
逐步完成安裝掛鉤
浏览卸载挂钩
使用安装/卸载挂钩创建/删除自定义架构
结论
首頁 後端開發 php教程 OpenCart:如何設定和刪除掛鉤

OpenCart:如何設定和刪除掛鉤

Aug 31, 2023 am 11:57 AM

OpenCart:如何設定和刪除掛鉤

身為模組開發人員,您通常需要在日常 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,因此显然我们需要在卸载过程中删除它,以确保我们不会留下任何特定于模块的垃圾。

此外,我们还可以快速了解一下 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles