Расширенные уведомления о скриптах в OpenCart 2.2.xx

Расширенные уведомления о скриптах в OpenCart 2.2.xx

От автора: сегодня мы обсудим одну из самых крутых функций — уведомления OpenCart скриптов. И хотя они были доступны с момента выпуска версии OpenCart 2.x, расширены они были только в последней версии OpenCart 2.2.xx. На протяжении всего этого урока мы будем обсуждать и продемонстрируем концепцию, создав рабочую модель.

Введение

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

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

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

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

Согласно официальной документации OpenCart:

Интернет-магазин на 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, чтобы она отображалась вo front-end . И хотя вы настроили cron, который регулярно обновляет информацию, вы хотите убедиться, что информация вo front-end отображается в режиме реального времени.

Вo front-end OpenCart вызывает функцию getProduct, когда отображается страница сведений о продукте. Итак, это идеальный кандидат для вас, чтобы подключиться и обновить базу данных, если информация API изменилась.

Давайте начнем создавать файлы back-end.

Дальше создаем admin/controller/module/demoevent.phpфайл со следующим содержимым:

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

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

Приступить к созданию
<?php
// admin/controller/module/demoevent.php
class ControllerModuleDemoevent extends Controller {
  private $error = array();
 
  public function install() {
 $this->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.phpсо следующим содержимым.

<?php
// admin/language/en-gb/module/demoevent.php
// Heading
$_['heading_title'] = 'Custom Event (Script Notification) Demo Module';

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

Создайте файл модели catalog/model/custom/product.php со следующим содержимым. Это типичный файл модели соответствующий структуре OpenCart.

<?php
// catalog/model/custom/product.php
class ModelCustomProduct extends Model {
  function getProductLastModifiedInfo($product_id) {
 $query = $this->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.

<?php
// catalog/controller/custom/product.php
class ControllerCustomProduct extends Controller {
 public function info($route, $product_id) {
 // fetch product info from API (psudo code)
 $product_api_info = api_call_to_fetch_product_info($product_id);
 
 // fetch product info from database
 $this->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'],
 'quantity' => $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, называемую скриптами уведомлений. Мы начали с введения в тему, а последняя половина этой статьи продемонстрировала, как использовать эту функцию, создавая настраиваемый модуль событий.

Автор: Sajal Soni

Источник: http://code.tutsplus.com/

Редакция: Команда webformyself.

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

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

Приступить к созданию
Самые свежие новости IT и веб-разработки на нашем Telegram-канале

OpenCart: быстрый старт, первые результаты

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

Получить

Метки:

Похожие статьи:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree