目录
逐步完成安装挂钩
浏览卸载挂钩
使用安装/卸载挂钩创建/删除自定义架构
结论
首页 后端开发 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):高低层次模块都依赖于抽象,通过依赖注入实现。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

如何用PHP的cURL库发送包含JSON数据的POST请求? 如何用PHP的cURL库发送包含JSON数据的POST请求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

See all articles