Розширені повідомлення про сценарії OpenCart 2.2.xx

2

Від автора: сьогодні ми обговоримо одну з найкрутіших функцій — повідомлення OpenCart скриптів. І хоча вони були доступні з моменту випуску версії OpenCart 2.x, розширені вони були тільки в останній версії OpenCart 2.2.xx. Протягом усього цього уроку ми будемо обговорювати і продемонструємо концепцію, створивши робочу модель.

Введення

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

Розглянемо це на простому прикладі. Якщо ви використовуєте популярний інтернет-магазин, швидше за все, будуть продані найпопулярніші продукти вашого магазину. У цьому випадку було б непогано отримувати повідомлення про це і відповідно приймати належні заходи.

Отже, що ви могли б зробити у вищезгаданому прикладі — знайти метод, який викликається при розміщенні замовлення. Потім потрібно підключитися до потоку створення замовлення, щоб можна було управляти їм при розміщенні замовлення. Це дозволить виконувати випадковий фрагмент коду в контексті викликається події. Саме там з’являються повідомлення про події, що дозволяє запускати довільний код і змінювати отриманий результат.

Що таке повідомлення скриптів?

Згідно офіційній документації OpenCart:

Розширені повідомлення про сценарії OpenCart 2.2.xx

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

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

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

У версії 2.2+ ми додали нову систему подій, це гачки, які можна викликати до і після подій, таких як виклик методу контролера, виклик методу моделі або файли шаблони. Вони дають можливість маніпулювати параметрами методу введення і поверненням виводу.

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

Що потрібно для реалізації повідомлень скриптів? Ось необхідні кроки:

Зареєструвати свій подія

Коли ви реєструєте свою подію з допомогою OpenCart, ви повідомляєте OpenCart, що хочете відслідковувати xyz дію, і якщо це станеться, виконайте дію foo у файлі контролера бару. При цьому у вас є два варіанти вибору: before and after.

Якщо ви виберете опцію before, OpenCart запустить дію foo перед дією, яка буде контролюватися, а в разі опції after воно виконає foo після дії. У разі опції before важливо відзначити, що якщо метод foo повертає що-небудь, OpenCart не буде виконувати оригінальний код методу, який взагалі контролюється.

Пізніше в цій статті ми побачимо, як реєструвати подія під час виконання спеціального модуля.

Запровадити цільове подія

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

Нам ще потрібен OCMOD?

Якщо ви знайомі з vQmod або OCMOD, швидше за все, збираєтеся взятися за функцію повідомлень, засукавши рукави. Зрештою, ви могли б досягти лише за рахунок вищезазначених фішок, які ви б у будь-якому випадку виконали з повідомленнями про події.

Отже, питання в тому, чи можна використовувати vQmod або OCMOD для зміни основних файлів, і чому ви використовуєте скрипти повідомлень? Це пов’язано з тим, що може бути кілька плагінів OCMOD, намагаються змінити один і той же код, це може призвести до конфлікту. У разі подій немає ніяких конфліктів, оскільки кожна подія виконується в певному порядку.

Таким чином, якщо можна використовувати події, зробіть це. З іншого боку, якщо ви відчуваєте, що для вашого прецеденту немає події, цілком нормально вести роботу з OCMOD.

Створення back-end модуля

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

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

Під front-end OpenCart викликає функцію getProduct, коли відображається сторінка дані про продукт. Отже, це ідеальний кандидат для вас, щоб підключитися і оновити базу даних, якщо інформація API змінилася.

Давайте почнемо створювати файли back-end.

Далі створюємо admin/controller/module/demoevent.рһрфайл з наступним вмістом:

Розширені повідомлення про сценарії OpenCart 2.2.xx

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

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

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

load->model(‘extension/event’);
$this->model_extension_event->addEvent(‘event_product_info’, ‘catalog/model/catalog/product/getProduct/before’, ‘custom/product/info’);
}
public function uninstall() {
$this->load->model(‘extension/event’);
$this->model_extension_event->deleteEvent(‘event_product_info’);
}
}

Як ми говорили раніше, перше, що потрібно зробити — це реєстрація події. Це хук установки, який ми будемо використовувати для цього, оскільки він буде виконаний, коли модуль встановлено.

Ми використовували addEvent метод моделі подій в каталозі розширень , і цей метод має три аргументи.

Перший аргумент event_product_info — це ім’я події. Ви могли б назвати його як завгодно, але переконайтеся, що назва унікально.

Другий аргумент дуже важливий, він вказує на метод, який потрібно підключити. У нашому випадку ми повинні вибрати getProduct метод моделі продукту в каталозі. Отже, ієрархія model/catalog/product/getProduct. На додаток до цього, він повинен бути префіксом або каталогу або адміністратора, які підтримують програму. У нашому випадку це каталог, оскільки ми підключаємося до методу front-end. Нарешті, він буде постфиксом або до або після, який викличе OpenCart для запуску коду.

Третій аргумент вказує на дію контролера, який буде спрацьовувати при запуску події. Він встановлений в custom/product/info, тому потрібно буде створити контролер продукту з допомогою info методу під налаштованим каталогом, ми це зробимо в одну мить.

Нарешті, метод видалення використовується для видалення події під час видалення модуля.

Давайте створимо мовний файл для нашого настроюваного модуля admin/language/en-gb/module/demoevent.рһрсо наступним вмістом.

Ми закінчили налаштування файлу back-end. Тепер ви можете побачити наш модуль, зазначений у розділі Extensions > Modules в back-end OpenCart. Тепер встановіть його і ми продовжимо і створимо файли у front-end.

Створіть файл моделі catalog/model/custom/product.php з наступним вмістом. Це типовий файл моделі відповідає структурі OpenCart.

db->query(«SELECT date_modified FROM» . DB_PREFIX . «product WHERE product_id = ‘» . (int)$product_id . «‘»);
return $query->row;
}
function updateProductInfo($product_id, $data) {
include_once __DIR__.’../../../admin/model/catalog/product.php’;
$modelCatalogProduct = new ModelCatalogProduct();
$modelCatalogProduct->editProduct($product_id, $data);
}
}

Він реалізує два важливих методу. Метод getProductLastModifiedInfo використовується для отримання останньої зміненої дати продукту, а updateProductInfo метод використовується для оновлення інформації про продукті в базі даних. Через деякий час ми побачимо, як ці методи будуть використовуватися.

Нарешті, давайте створимо один з найбільш важливих файлів цієї статті catalog/controller/custom/product.php, з наступним змістом. Це файл контролера, який реалізує info метод дії, який викликається при натисненні getProduct методу Product Model.

load->model(‘custom/product’);
$product_modified_date = $this->model_custom_product->getProductLastModifiedInfo($product_id);
if ($product_modified_date[‘date_modified’] != $product_api_info[‘date_modified’]) {
// api info has changed so first let’s update db
// Note: you probably want to format $product_api_info as per the format required by editProduct method
$this->model_custom_product->updateProductInfo($product_id, $product_api_info);
// return latest/real-time product information
return array(
‘product_id’ => $product_api_info[‘product_id’],
‘name’ => $product_api_info[‘name’],
‘description’ => $product_api_info[‘description’],
‘meta_title’ => $product_api_info[‘meta_title’],
‘meta_description’ => $product_api_info[‘meta_description’],
‘meta_keyword’ => $product_api_info[‘meta_keyword’],
‘tag’ => $product_api_info[‘tag’],
‘model’ => $product_api_info[‘model’],
‘sku’ => $product_api_info[‘sku’],
‘upc’ => $product_api_info[‘upc’],
‘ean’ => $product_api_info[‘ean’],
‘jan’ => $product_api_info[‘jan’],
‘isbn’ => $product_api_info[‘isbn’],
‘mpn’ => $product_api_info[‘mpn’],
‘location’ => $product_api_info[‘location’],
‘кількість’ => $product_api_info[‘quantity’],
‘stock_status’ => $product_api_info[‘stock_status’],
‘image’ => $product_api_info[‘image’],
‘manufacturer_id’ => $product_api_info[‘manufacturer_id’],
‘manufacturer’ => $product_api_info[‘manufacturer’],
‘price’ => ($product_api_info[‘discount’] ? $product_api_info[‘discount’] : $product_api_info[‘price’]),
‘special’ => $product_api_info[‘special’],
‘reward’ => $product_api_info[‘reward’],
‘points’ => $product_api_info[‘points’],
‘tax_class_id’ => $product_api_info[‘tax_class_id’],
‘date_available’ => $product_api_info[‘date_available’],
‘weight’ => $product_api_info[‘weight’],
‘weight_class_id’ => $product_api_info[‘weight_class_id’],
‘length’ => $product_api_info[‘length’],
‘width’ => $product_api_info[‘width’],
‘height’ => $product_api_info[‘height’],
‘length_class_id’ => $product_api_info[‘length_class_id’],
‘subtract’ => $product_api_info[‘subtract’],
‘rating’ => round($product_api_info[‘rating’]),
‘reviews’ => $product_api_info[‘reviews’] ? $product_api_info[‘reviews’] : 0,
‘minimum’ => $product_api_info[‘minimum’],
‘sort_order’ => $product_api_info[‘sort_order’],
‘status’ => $product_api_info[‘status’],
‘date_added’ => $product_api_info[‘date_added’],
‘date_modified’ => $product_api_info[‘date_modified’],
‘viewed’ => $product_api_info[‘viewed’]
);
}
}
}

Важливо відзначити, що OpenCart надає для методу контекстні аргументи. Перший $route аргумент повідомляє вам маршрут, пов’язаний з подією, що було викликано. У нашому випадку це має бути catalog/product/getProduct. Другий аргумент — це ідентифікатор продукту, так як він є необхідною аргументом фактичним getProduct методом.

Отже, перший крок — завантажити інформацію про продукт у реальному часі з API. Зверніть увагу, що метод api_call_to_fetch_product_info — це лише фіктивний метод, який ви хочете замінити своїм фактичним викликом API.

Потім ми використовуємо getProductLastModifiedInfo метод, який був створений у попередньому розділі, щоб отримати змінену дату продукту з бази даних OpenCart.

Нарешті, ми проводимо порівняння, і якщо дата відрізняється, він оновлює базу даних OpenCart з останньою інформацією про продукт, використовуючи updateProductInfo метод в нашому класі Model.

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

Таким чином, ви можете вплинути на потік виконання в OpenCart. Це дійсно потужний спосіб змінити основні функції. Тим не менш, ви повинні бути обережні при прийнятті цього рішення, оскільки воно дає вам повний контроль над змінами підсумкового результату будь-якого методу.

Висновок

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

Розширені повідомлення про сценарії OpenCart 2.2.xx

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

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

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