OpenCart: Bagaimana untuk menyediakan dan mengeluarkan cangkuk

WBOY
Lepaskan: 2023-08-31 11:58:01
asal
933 orang telah melayarinya

OpenCart: Bagaimana untuk menyediakan dan mengeluarkan cangkuk

Sebagai pembangun modul, anda selalunya perlu mencipta seni bina tersuai dalam pembangunan modul tersuai OpenCart harian anda. Seperti rangka kerja lain, ia telah dikonfigurasikan dalam bentuk cangkuk yang berbeza dalam seni bina modul OpenCart.

Sebelum kita meneruskan penerokaan cangkuk di atas, mari kita terokai konsep sambungan dalam OpenCart. Melihat dari atas ke bawah, ia adalah sambungan dalam OpenCart yang membolehkan anda memperkayakan fungsi teras OpenCart. Dengan memasangnya, anda boleh menambah kefungsian pada kedai hadapan anda, sama ada galeri imej ringkas atau beberapa fungsi drag-and-drop yang kelihatan hebat.

Selain itu, sambungan dikategorikan ke dalam kumpulan logik berdasarkan kefungsian yang disediakan. Sebagai contoh mudah, Pelanjutan Pembayaran menambah kaedah pembayaran baharu pada pembayaran bahagian hadapan, manakala pelanjutan antipenipuan yang membolehkan anda mengesan aktiviti spam di kedai anda. Pergi ke bahagian belakang dan lihat senarai di bawah menu Sambungan, yang menunjukkan pelbagai jenis sambungan yang disokong OpenCart.

Anda akan terkejut apabila mengetahui bahawa modul juga hanyalah satu lagi sambungan dalam OpenCart. Setiap sambungan dibina berdasarkan aliran kerja biasa tentang cara perkara harus berfungsi dalam ekosistem OpenCart. Cangkuk membolehkan anda melakukan tindakan tertentu berdasarkan acara tertentu, sama ada menjalankan cangkuk pemasangan semasa pengaktifan modul atau membersihkan sampah semasa menyahpasang.

Artikel ini akan membincangkan cangkuk pemasangan dan nyahpasang ini. Walaupun ia akan dibincangkan dalam konteks modul, saya tidak nampak apa-apa yang menghalang anda daripada menggunakan pendekatan yang sama pada jenis sambungan lain juga, jadi jangan ragu untuk meneroka fail itu sendiri.

Ini ialah versi terkini OpenCart yang menyediakan coretan dalam tutorial ini. Sehingga berita ini ditulis, ia adalah versi stabil 2.1.0.2.

Langkah demi langkah pemasangan cangkuk

Dalam bahagian ini, kita akan meneroka kegunaan khusus cangkuk pelekap. Teruskan dan buka admin/controller/extension/module.php dalam editor teks kegemaran anda dan cari kaedah install. Ia sepatutnya kelihatan seperti ini: 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();
  }
  ...
?>
Salin selepas log masuk

这是模块的通用安装钩子,每当您尝试从后端安装任何模块时都会调用该钩子。让我们来看看这个方法的重要部分。

首先,它加载后续活动所需的模型文件。 $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');
  }
  ...
?>
Salin selepas log masuk

自 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();
  }
  ...
?>
Salin selepas log masuk

首先,它加载相应的模型文件,并使用该文件调用模型的 install 方法。根据经验,每当您想要操作模式时,都应该在模型的安装方法中实现该代码,而不是直接将其放入控制器的安装方法中。

现在,让我们快速拉入模型文件 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;");
  }
  ...
?>
Salin selepas log masuk

Ini ialah cangkuk pemasangan universal untuk modul, cangkuk ini akan dipanggil setiap kali anda cuba memasang mana-mana modul dari bahagian belakang. Mari kita lihat bahagian penting kaedah ini.

Pertama, ia memuatkan fail model yang diperlukan untuk aktiviti seterusnya. Panggilan kaedah $this->model_extension_extension->install memastikan bahawa entri untuk modul khusus ini ditambahkan pada pangkalan data.

Seterusnya ialah beberapa kandungan ACL, yang dilakukan dengan memanggil kaedah addPermission. Ia memastikan bahawa pentadbir pengguna semasa seharusnya boleh mengakses tetapan khusus modul dan mengubahnya. #🎜🎜# #🎜🎜#Akhir sekali, ia memanggil kaedah install modul yang sedang dipasang. Jangan dikelirukan dengan kaedah pemasangan yang telah kami gunakan - ia memanggil kaedah pasang khusus modul jika ada. #🎜🎜# #🎜🎜# Sebagai contoh, jika anda cuba memasang modul #🎜🎜# Log masuk dengan PayPal #🎜🎜#, ia akan memanggil kaedah pemasangan yang ditakrifkan dalam fail admin/controller/module/ pp_login.php< /code> ditunjukkan di bawah. #🎜🎜# <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbal:false;">&lt;?php ... public function uninstall() { $this-&gt;load-&gt;language('extension/module'); $this-&gt;document-&gt;setTitle($this-&gt;language-&gt;get('heading_title')); $this-&gt;load-&gt;model('extension/extension'); $this-&gt;load-&gt;model('extension/module'); if ($this-&gt;validate()) { $this-&gt;model_extension_extension-&gt;uninstall('module', $this-&gt;request-&gt;get['extension']); $this-&gt;model_extension_module-&gt;deleteModulesByCode($this-&gt;request-&gt;get['extension']); $this-&gt;load-&gt;model('setting/setting'); $this-&gt;model_setting_setting-&gt;deleteSetting($this-&gt;request-&gt;get['extension']); // Call uninstall method if it exists $this-&gt;load-&gt;controller('module/' . $this-&gt;request-&gt;get['extension'] . '/uninstall'); $this-&gt;session-&gt;data['success'] = $this-&gt;language-&gt;get('text_success'); $this-&gt;response-&gt;redirect($this-&gt;url-&gt;link('extension/module', 'token=' . $this-&gt;session-&gt;data['token'], 'SSL')); } $this-&gt;getList(); } ... ?&gt; </pre><div class="contentsignin">Salin selepas log masuk</div></div><div class="contentsignin">Salin selepas log masuk</div></div> #🎜🎜# Sejak dilancarkan, OpenCart 2.x telah menyertakan beberapa ciri menarik dan Pemerhati Acara adalah salah satu daripadanya. Ia membolehkan anda menambah peristiwa khusus modul yang mana modul lain boleh menetapkan pemerhati supaya mereka boleh menjalankan beberapa kod sewenang-wenangnya apabila peristiwa khusus itu dicetuskan. Inilah yang ditunjukkan dalam kaedah pemasangan di atas, yang menambahkan acara tersuai <code class="inline">post.customer.logout! #🎜🎜# #🎜🎜# Setakat modul #🎜🎜# Log masuk dengan PayPal #🎜🎜#, ia adalah perkara yang agak mudah, tetapi kadangkala anda memerlukan lebih banyak lagi jika anda ingin menyuntik skema tersuai atau sesuatu seperti itu. Mari bawa masuk kaedah pemasangan kami dari #🎜🎜#PayPal Express Checkout#🎜🎜# sambungan pembayaran. Teruskan membuka admin/controller/ payment/pp_express.php. #🎜🎜#
<?php
  ...
  public function uninstall() {
    $this->load->model('extension/event');

    $this->model_extension_event->deleteEvent('pp_login');
  }
  ...
?>
Salin selepas log masuk
Salin selepas log masuk
#🎜🎜#Pertama, ia memuatkan fail model yang sepadan dan menggunakan fail itu untuk memanggil kaedah install model. Sebagai peraturan, setiap kali anda ingin mengendalikan mod, anda harus melaksanakan kod tersebut dalam kaedah pelekap model dan bukannya meletakkannya terus ke dalam kaedah pelekap pengawal. #🎜🎜# #🎜🎜#Sekarang, mari gunakan kaedah pemasangan yang ditakrifkan dalam fail model admin/model/ payment/pp_express.php. #🎜🎜#
<?php
  ...
  public function uninstall() {
    $this->load->model('payment/pp_express');
    $this->model_payment_pp_express->uninstall();
  }
  ...
?>
Salin selepas log masuk
Salin selepas log masuk
#🎜🎜#Akhirnya sesuatu yang patut disyukuri! Seperti yang anda lihat, beberapa jadual MySQL tersuai telah dibuat menggunakan API pangkalan data OpenCart. Jadi, berikut ialah cara untuk menggunakan perubahan berkaitan pangkalan data menggunakan kaedah pemasangan model. #🎜🎜# #🎜🎜#Jadi, sejauh mata kail melekap, ini dia. Saya harap ia tidak begitu rumit seperti yang kelihatan pada pandangan pertama. Mari kita letakkannya seperti ini. Proses ini bermula dengan mencetuskan kaedah pemasangan khusus sambungan, yang seterusnya memanggil kaedah pemasangan sambungan yang sedang dipasang (jika ada). Akhir sekali, jika sambungan memerlukan sebarang operasi pangkalan data, kaedah pemasangan model dipanggil daripada kaedah pemasangan pengawal. #🎜🎜#

浏览卸载挂钩

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

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

很简单吧?它只是撤消注入到使用 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();
  }
  ...
?>
Salin selepas log masuk
Salin selepas log masuk

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

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

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

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

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

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

<?php
// Heading
$_['heading_title']    = 'Demo Module';
Salin selepas log masuk

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

最后,继续创建一个包含以下内容的控制器文件 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();
  }
}
Salin selepas log masuk

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

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

结论

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

当然,欢迎提问和评论!

Atas ialah kandungan terperinci OpenCart: Bagaimana untuk menyediakan dan mengeluarkan cangkuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!