Встановлення та видалення розширень за допомогою хуків в OpenCart

11

Від автора: якщо ви розробник модулів, то вам часто у щоденній роботі доводиться створювати кастомні схеми в OpenCart. Така можливість вже передбачена, як і в інших фреймворках, у вигляді різних хуків в архітектурі модулів. Сьогодні ми поговоримо про те, як відбувається в OpenCart установка розширень, і яку роль відіграють у цьому хуки.

Перш ніж перейти до хукам, давайте познайомимося з концепцією розширень в OpenCart. Якщо дивитися поверхово, то це розширення в OpenCart, що дозволяють розширити функціональність OpenCart. Встановлюючи розширення, ви додаєте функції front end частина магазину, будь то проста галерея зображень чи якась кумедна функція drag-and-drop.

По надається функціональності розширення діляться на логічні групи. Наприклад, розширення payment додає нові способи оплати на сторінку оформлення замовлення на front end. Крім того, дане розширення захищає від шахраїв і дозволяє визначати спам в магазині. Перейдіть на back end і відкрийте список у меню Extensions – це список розширень різного типу, підтримуваних в OpenCart.

Ви здивуєтеся, але module також є видом розширення в OpenCart. Все розширення побудовані за загальним принципом екосистеми OpenCart. Хуки дозволяють виконувати певні дії на основі певних подій. Це може бути, наприклад, запуск хука установки під час активації модуля або очищення від сміття під час видалення.

У цій статті ми поговоримо про хуках, що відповідають за установку і видалення. Ми обговоримо їх у рамках модулів, але ви можете застосовувати такий же підхід до розширень іншого виду. Не бійтеся копатися в файлах.

Встановлення та видалення розширень за допомогою хуків в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

Код, представлений в уроці, відноситься до останньої версії OpenCart. На момент написання це стабільна версія 2.1.0.2.

Життєвий цикл хука установки

У цьому розділі ми дізнаємося, навіщо потрібен хук install. Відкрийте файл admin/controller/extension/module.php в текстовому редакторі і знайдіть метод install. Метод повинен виглядати приблизно так:

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(), ‘змінити’, ‘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();
}

?>

Це загальний хук install для модуля, який буде викликатися при будь-якій спробі встановити будь модуль через back end. Розберемо важливі частини методу.

Спершу метод завантажує файли моделі, необхідні для подальших дій. Метод $this->model_extension_extension->install забезпечує додавання запису до бази даних для певного модуля.

Далі йде трохи ACL (метод addPermission). Перевіряється, що поточному користувачу (адмін) доступні настройки модуля і можливість їх змінювати.

Далі викликається метод install встановлюється модуля. Не плутайте з методом install, в якому ми знаходимося прямо зараз. Буде викликаний метод install конкретного модуля, якщо метод існує.

Наприклад, якщо спробувати встановити модуль Log In with PayPal, буде викликаний метод install, визначений у файлі admin/controller/module/pp_login.php як показано нижче.

load->model(‘extension/event’);
$this->model_extension_event->addEvent(‘pp_login’, ‘post.customer.logout’, ‘module/pp_login/logout’);
}

?>

Починаючи з OpenCart 2.x, було додано декілька приголомшливих функцій. Одна з них event-observer. З її допомогою можна додавати події, що відносяться до певних модулів, а інші модулі можуть встановити оглядачі, які будуть чекати ці події і при їх спрацьовуванні запускати якийсь код. Саме це продемонстровано в методі install вище. Метод додає кастомное подія post.customer.logout!

З модулем Log In with PayPal все просто, але іноді, якщо необхідно створити кастомний схему або щось схоже, потрібно більше. Давайте знайдемо метод install з розширення оплати PayPal Express Checkout. Відкрийте файл admin/controller/payment/pp_express.php.

load->model(‘payment/pp_express’);
$this->model_payment_pp_express->install();
}

?>

Спочатку метод завантажує відповідний файл моделі і з його допомогою викликає метод install моделі. Правило №1 – якщо хочете маніпулювати схемою, код писати необхідно в методі install моделі, а не безпосередньо в метод install контролера.

Тепер давайте швидко поглянемо на метод install файлу моделі admin/model/payment/pp_express.php.

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;»);
}

?>

Нарешті, є що розповісти! Як бачите, тут з допомогою API баз даних OpenCart створюється кілька кастомних MySQL таблиць. Таким чином можна застосовувати зміни до бази даних через метод install моделі.

За хуку install все. Сподіваюся, для першого разу пояснення не здалися складними. Скажімо так, процес запускається викликом методу install розширення, який, у свою чергу, викликає метод install розширення, яке зараз встановлюється (якщо метод існує). Наприкінці якщо розширення вимагає маніпуляцій з базою даних, методу install контролера викликається метод install моделі.

Життєвий цикл хука видалення

На відміну від попереднього розділу, в цьому ми розберемо хук uninstall. Підемо аналогічним процесом, як для методу install з попереднього розділу. Відкрийте файл admin/controller/extension/module.php і знайдіть хук uninstall.

Встановлення та видалення розширень за допомогою хуків в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення

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 таблиці extension.

Далі викликається deleteModulesByCode, який видаляє модулю, що відносяться до розширення. Цей метод реалізований тільки для цього типу module розширення. В інших розширення типу payment, shipping, fraud і т. д. ви його не знайдете.

Так зроблено тому, що ви можете продублювати всі модулі для створення декількох об’єктів. Наприклад, можна відображати різні модулі banner на різних сторінках. З іншого боку, немає сенсу дублювати розширення іншого виду. Як приклад, для розширення PayPal на front end доступний тільки один об’єкт.

Далі викликається метод deleteSetting , який видаляє змінні налаштування модуля. В кінці викликається метод uninstall видаляється модуля.

Відкриємо файл admin/controller/module/pp_login.php подивимося як виглядає метод uninstall.

load->model(‘extension/event’);
$this->model_extension_event->deleteEvent(‘pp_login’);
}

?>

Просто, так адже? Метод просто скасовує дії методу install модуля Log In with PayPal. Пам’ятайте, ми створили нове подія post.customer.logout під час установки. Його-то нам і треба видалити, щоб не залишити ніякого сміття від модуля.

Давайте подивимося на метод uninstall розширення PayPal Express Checkout, ми пройшлися по методу install в попередньому розділі. Знайдіть наступний код у файлі admin/controller/payment/pp_express.php.

load->model(‘payment/pp_express’);
$this->model_payment_pp_express->uninstall();
}

?>

Все досить очікувано – метод завантажує модель і викликає метод uninstall. Тому давайте відкриємо файл admin/model/payment/pp_express.php і поглянемо на метод uninstall там.

db->query(«DROP TABLE IF EXISTS `» . DB_PREFIX . «paypal_order_transaction`;»);
$this->db->query(«DROP TABLE IF EXISTS `» . DB_PREFIX . «paypal_order`;»);
}

?>

Ми просто видаляємо MySQL таблиці, створені раніше. Адже Нам не потрібні ці питання «як ти міг залишити це сміття?».

Сподіваюся, мені вдалося зрозуміло розповісти про життєві цикли хуків install і uninstall в OpenCart. В наступному і останньому розділі ще раз згадаємо концепції, вивчені сьогодні в простому, але працюючому кастомном модулі. Про такі речі корисно пам’ятати.

Створення/видалення кастомних схеми через хуки install/uninstall

У цьому розділі ми створимо админский модуль demo, який буде створювати нову схему під час установки і видаляти її під час видалення.

Спочатку створіть мовний файл, щоб модуль підтягнувся до back end. Створіть файл admin/language/english/module/demo.php з таким кодом.

Далі необхідно створити файл моделі з реальним і цікавим кодом. Файл моделі має бути admin/model/module/demo.php. Він MySQL створює таблицю demo у методі install і видаляє таблицю в методі uninstall.

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 з таким кодом.

load->model(‘module/demo’);
$this->model_module_demo->install();
}
public function uninstall() {
$this->load->model(‘module/demo’);
$this->model_module_demo->uninstall();
}
}

Все просто – завантажується модель, викликаються відповідні методи залежно від виконуваного дії.

Спробуйте самі. Модуль Demo Module має відобразитися в Extensions > Modules. Встановіть його, після чого в back end створиться MySQL таблиця demo. Не забудьте видалити цю таблицю.

Висновок

Сьогодні ми обговорили важливий аспект процес установки OpenCart – хуки install і uninstall. Ми детально розібрали пристрій хуков, а в останній частині статті створили простий модуль для підтвердження концепції роботи.

Встановлення та видалення розширень за допомогою хуків в OpenCart

Інтернет-магазин на OpenCart!

Створити інтернет-магазин на самій популярної CMS OpenCart з нуля!

Приступити до створення