Статьи

Установить и удалить крючки в OpenCart

Как разработчик модулей, вам чаще всего нужно создавать собственные схемы в повседневной разработке пользовательских модулей OpenCart. Это уже обеспечено, как с другими структурами, в форме различных хуков в архитектуре модуля OpenCart.

Прежде чем мы продолжим изучение вышеупомянутых хуков, давайте рассмотрим концепцию расширений в OpenCart. Если смотреть сверху, это расширение в OpenCart, которое позволяет вам обогащать основные функциональные возможности OpenCart. Устанавливая его, вы добавляете функции в интерфейсное хранилище, будь то простая галерея изображений или какая-то необычная функция перетаскивания.

Кроме того, расширения, в зависимости от предоставляемых ими функций, делятся на логические группы. В качестве быстрого примера, расширение оплаты добавляет новые способы оплаты в интерфейсный контроль, в то время как это расширение для защиты от мошенничества, которое позволяет обнаруживать спам в вашем магазине. Перейдите на задний план и посмотрите на список в меню « Расширения», который показывает различные виды расширений, поддерживаемых в OpenCart.

Вы будете удивлены, узнав, что модуль — это просто еще один вид расширения в OpenCart. Каждое расширение построено вокруг общего рабочего процесса о том, как все должно работать в экосистеме OpenCart. А ловушки позволяют вам выполнять определенные действия в зависимости от конкретных событий, будь то запуск ловушки установки во время активации модуля или очистка мусора во время удаления.

Это будут те хуки установки и удаления, которые будут обсуждаться в течение всей статьи. Хотя они будут обсуждаться в контексте модулей, я не вижу ничего, что мешало бы вам применять тот же метод к другим видам расширений, поэтому не стесняйтесь исследовать эти файлы самостоятельно.

Это последняя версия OpenCart, которая предоставляет фрагменты, распространяемые в этом руководстве. На момент написания статьи это стабильная версия 2.1.0.2.

В этом разделе мы рассмотрим, для чего именно используется хук установки. Идите вперед и откройте admin/controller/extension/module.php в вашем любимом текстовом редакторе и найдите метод install . Это должно выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?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 метода $this->model_extension_extension->install обеспечивает добавление записи в базу данных для этого конкретного модуля.

После этого есть некоторые вещи ACL, и это достигается путем вызова метода addPermission . Он гарантирует, что текущий пользователь, администратор, должен иметь доступ к настройкам модуля и изменять их.

Наконец, он вызывает метод install модуля. Не путайте метод установки, в котором мы уже работаем — он вызовет метод install специфичный для модуля, если он существует.

Например, если вы пытаетесь установить модуль « Вход в систему с помощью PayPal », он вызовет метод установки, определенный в файле admin/controller/module/pp_login.php как показано ниже.

1
2
3
4
5
6
7
8
9
<?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 .

1
2
3
4
5
6
7
8
<?php
  …
  public function install() {
    $this->load->model(‘payment/pp_express’);
    $this->model_payment_pp_express->install();
  }
  …
?>

Сначала он загружает соответствующий файл модели и, используя его, вызывает метод install модели. Как правило, всякий раз, когда вы хотите манипулировать схемой, вы должны реализовать этот код в методе установки модели, а не вставлять его непосредственно в метод установки контроллера.

Теперь давайте быстро admin/model/payment/pp_express.php метод установки, определенный в файле модели admin/model/payment/pp_express.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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;»);
  }
  …
?>

Наконец, есть что поболеть за! Как видите, пара пользовательских таблиц MySQL создается с использованием API базы данных OpenCart. Таким образом, это способ применить изменения, связанные с базой данных, используя метод установки модели.

Итак, вот и все, что касается хука установки. Надеюсь, это не так сложно, как кажется на первый взгляд. Скажем так. Процесс начинается с запуска метода установки для конкретного расширения, который, в свою очередь, вызывает метод установки устанавливаемого расширения, если оно существует. Наконец, метод установки модели вызывается из метода установки контроллера в случае, если это расширение требует каких-либо манипуляций с базой данных.

Этот раздел, аналог предыдущего раздела, рассказывает о событиях в ловушке удаления. Мы будем действовать так же, как и для метода установки в предыдущем разделе, поэтому давайте сразу же возьмем код ловушки uninstall из файла admin/controller/extension/module.php .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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 чтобы увидеть, как выглядит метод удаления.

1
2
3
4
5
6
7
8
9
<?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 .

1
2
3
4
5
6
7
8
<?php
  …
  public function uninstall() {
    $this->load->model(‘payment/pp_express’);
    $this->model_payment_pp_express->uninstall();
  }
  …
?>

Весьма ожидаемый материал — он загружает модель и вызывает метод удаления. Это также дает нам admin/model/payment/pp_express.php причину открыть файл модели admin/model/payment/pp_express.php и изучить метод удаления.

1
2
3
4
5
6
7
8
<?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 со следующим содержимым.

1
2
3
<?php
// Heading
$_[‘heading_title’] = ‘Demo Module’;

Далее нам нужно создать файл модели, который содержит актуальный и интересный код нашего пользовательского модуля. Файл модели должен быть помещен в admin/model/module/demo.php . Он создает демонстрационную таблицу MySQL в методе install и удаляет ее в методе uninstall .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?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 со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
<?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();
  }
}

Это просто, как и должно быть — загружает модель и вызывает соответствующие методы в зависимости от выполняемых действий.

Давай и попробуй. Он должен быть указан как демонстрационный модуль в разделе Расширения> Модули . Установите его, и вы увидите демонстрационную таблицу MySQL, созданную в бэк-энде, и, конечно же, не забудьте удалить ее, чтобы удалить таблицу.

Сегодня мы обсудили важный аспект процесса установки OpenCart, хуки установки и удаления. Мы рассмотрели детали этих хуков, и в последующей части статьи мы создали простой модуль в качестве доказательства концепции.

Конечно, вопросы и комментарии всегда приветствуются!