OpenCart : Comment configurer et supprimer des hooks

WBOY
Libérer: 2023-08-31 11:58:01
original
933 Les gens l'ont consulté

OpenCart : Comment configurer et supprimer des hooks

En tant que développeur de modules, vous devez souvent créer des architectures personnalisées dans votre développement quotidien de modules personnalisés OpenCart. Comme d’autres frameworks, il a été configuré sous la forme de différents hooks dans l’architecture du module OpenCart.

Avant de continuer à explorer les hooks ci-dessus, explorons le concept d'extensions dans OpenCart. En regardant de haut en bas, il s'agit d'une extension d'OpenCart qui vous permet d'enrichir les fonctions de base d'OpenCart. En l'installant, vous pouvez ajouter des fonctionnalités à votre boutique frontale, qu'il s'agisse d'une simple galerie d'images ou d'une fonctionnalité de glisser-déposer sophistiquée.

De plus, les extensions sont classées en groupes logiques en fonction des fonctionnalités qu'elles fournissent. À titre d'exemple simple, l'extension Payments ajoute de nouvelles méthodes de paiement au paiement frontal, alors qu'il s'agit d'une extension anti-fraude qui vous permet de détecter l'activité de spam dans votre boutique. Accédez au backend et consultez la liste sous le menu Extensions, qui montre les différents types d'extensions prises en charge par OpenCart.

Vous serez surpris de savoir que les modules ne sont également qu'une autre extension d'OpenCart. Chaque extension est construite autour d'un flux de travail commun sur la façon dont les choses devraient fonctionner dans l'écosystème OpenCart. Les hooks vous permettent d'effectuer certaines actions en fonction d'événements spécifiques, qu'il s'agisse d'exécuter un hook d'installation lors de l'activation du module ou de nettoyer les déchets lors de la désinstallation.

Cet article abordera ces hooks d'installation et de désinstallation. Bien qu'ils soient abordés dans le cadre des modules, je ne vois rien qui vous empêche d'appliquer la même approche à d'autres types d'extensions également, alors n'hésitez pas à explorer ces fichiers par vous-même.

Il s'agit de la dernière version d'OpenCart qui fournit les extraits de ce didacticiel. Au moment d'écrire ces lignes, il s'agit de la version stable 2.1.0.2.

Crochet d'installation étape par étape

Dans cette section, nous explorerons les utilisations spécifiques des crochets de montage. Allez-y et ouvrez la méthode admin/controller/extension/module.php,然后找到 install dans votre éditeur de texte préféré. Cela devrait ressembler à ceci :

<?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();
  }
  ...
?>
Copier après la connexion

Il s'agit d'un hook d'installation universel pour les modules qui sera appelé chaque fois que vous essayez d'installer un module à partir du backend. Jetons un coup d'œil aux parties importantes de cette méthode.

Tout d'abord, il charge les fichiers de modèle requis pour les activités ultérieures. $this->model_extension_extension->install L'appel de méthode garantit qu'une entrée pour ce module spécifique est ajoutée à la base de données.

Vient ensuite quelques éléments ACL, qui se font en appelant la méthode addPermission. Cela garantit que l'administrateur utilisateur actuel doit pouvoir accéder aux paramètres spécifiques au module et les modifier.

Enfin, il appelle la méthode install 方法。不要与我们已经使用的 install 方法混淆 - 它会调用模块特定的 install du module en cours d'installation (s'il existe).

Par exemple, si vous essayez d'installer le module Connexion avec PayPal, il appellera le fichier admin/controller/module 中定义的安装方法/pp_login.php comme indiqué ci-dessous.

<?php
  ...
  public function install() {
    $this->load->model('extension/event');

    $this->model_extension_event->addEvent('pp_login', 'post.customer.logout', 'module/pp_login/logout');
  }
  ...
?>
Copier après la connexion

Depuis son lancement, OpenCart 2.x a inclus des fonctionnalités intéressantes, et Event Observer en fait partie. Il vous permet d'ajouter des événements spécifiques au module pour lesquels d'autres modules peuvent définir des observateurs afin qu'ils puissent exécuter du code arbitraire lorsque cet événement spécifique est déclenché. C'est exactement ce qui est démontré dans la méthode d'installation ci-dessus, qui ajoute post.customer.logout des événements personnalisés !

En ce qui concerne le module Connexion avec PayPal, c'est des choses assez simples, mais parfois vous en aurez besoin de plus si vous souhaitez injecter un schéma personnalisé ou quelque chose comme ça. Introduisons notre méthode d'installation à partir de l'extension de paiement PayPal Express Checkout. Continuez à ouvrir admin/controller/ payment/pp_express.php.

<?php
  ...
  public function install() {
    $this->load->model('payment/pp_express');
    $this->model_payment_pp_express->install();
  }
  ...
?>
Copier après la connexion

Tout d'abord, il charge le fichier modèle correspondant et utilise ce fichier pour appeler la méthode install du modèle. En règle générale, chaque fois que vous souhaitez utiliser un mode, vous devez implémenter ce code dans la méthode de montage du modèle plutôt que de le placer directement dans la méthode de montage du contrôleur.

Maintenant, intégrons rapidement la méthode d'installation définie dans le fichier modèle admin/model/ payment/pp_express.php.

<?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;");
  }
  ...
?>
Copier après la connexion

Enfin quelque chose pour lequel il faut être reconnaissant ! Comme vous pouvez le constater, plusieurs tables MySQL personnalisées ont été créées à l'aide de l'API de base de données d'OpenCart. Voici donc comment appliquer les modifications liées à la base de données à l'aide de la méthode d'installation du modèle.

Donc, en ce qui concerne les crochets de montage, c'est tout. J'espère que ce n'est pas aussi compliqué qu'il y paraît à première vue. Disons-le de cette façon. Le processus commence par le déclenchement d'une méthode d'installation spécifique à l'extension, qui à son tour appelle la méthode d'installation de l'extension en cours d'installation (si elle existe). Enfin, si l'extension nécessite des opérations de base de données, la méthode d'installation du modèle est appelée à partir de la méthode d'installation du contrôleur.

浏览卸载挂钩

本节与上一节相对应,重点介绍卸载挂钩中发生的情况。我们将按照与上一节中的 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();
  }
  ...
?>
Copier après la connexion

同样,它看起来应该有点熟悉,因为其中大部分是样板代码。首先的重要代码片段是调用 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');
  }
  ...
?>
Copier après la connexion

很简单吧?它只是撤消注入到使用 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();
  }
  ...
?>
Copier après la connexion

完全符合预期——它加载模型并调用卸载方法。这也给了我们打开模型文件 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`;");
  }
  ...
?>
Copier après la connexion

我们只是删除之前创建的 MySQL 表,因为我们不希望有人问我们,“你怎么能留下这些垃圾?”

所以,这就是 OpenCart 中安装和卸载挂钩的故事,希望不错。下一部分也是最后一部分快速总结了迄今为止在一个简单但有效的自定义模块中学到的概念,因为这在你的小猫后理论课程中是一件很好的事情。

使用安装/卸载挂钩创建/删除自定义架构

在本节中,我们将创建一个管理模块演示,除了在安装期间创建新架构并在卸载期间删除它之外,该模块不会做太多事情。

首先,让我们创建一个语言文件,以便在后端拾取该模块。继续创建一个包含以下内容的文件 admin/language/english/module/demo.php

<?php
// Heading
$_['heading_title']    = 'Demo Module';
Copier après la connexion

接下来,我们需要创建一个模型文件来保存自定义模块的实际且有趣的代码。模型文件应放置在 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`;");
  }
}
Copier après la connexion

最后,继续创建一个包含以下内容的控制器文件 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();
  }
}
Copier après la connexion

它应该很简单 - 它加载模型并根据正在执行的操作调用相应的方法。

来吧,尝试一下。它应该在扩展 > 模块下列为演示模块。安装它,你应该会看到后端创建的 demo MySQL 表,当然不要忘记卸载它以删除该表。

结论

今天,我们讨论了 OpenCart 安装过程的一个重要方面,即安装和卸载挂钩。我们详细介绍了这些挂钩,并在本文的后面部分构建了一个简单的模块作为概念证明。

当然,欢迎提问和评论!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!