首页 >后端开发 >php教程 >OpenCart:如何设置和删除挂钩

OpenCart:如何设置和删除挂钩

WBOY
WBOY原创
2023-08-31 11:57:08970浏览

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,因此显然我们需要在卸载过程中删除它,以确保我们不会留下任何特定于模块的垃圾。 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn