Статьи

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

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

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

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

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

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

В версии 2.2+ мы добавили новую систему событий, это ловушки, которые можно вызывать до и после событий, таких как вызов метода контроллера, вызов метода модели или загружаемые шаблоны. Они дают возможность манипулировать параметрами метода ввода и возвращаемого результата.

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

Что нужно для реализации скриптовых уведомлений? Вот необходимые шаги:

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

Если вы выберете опцию before, OpenCart будет запускать действие foo перед отслеживаемым действием, а в случае опции after он будет выполнять foo после действия. В случае с параметром before важно отметить, что если метод foo возвращает что-либо, OpenCart не будет выполнять исходный код метода, который отслеживается вообще.

Далее в этой статье мы увидим, как зарегистрировать событие во время реализации пользовательского модуля.

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

Так что это только проблеск того, на что способны уведомления скриптов.

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

Для тех, кто не знаком ни с vQmod, ни с OCMOD, ниже перечислены хорошие вводные статьи, которые объясняют это.

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

Таким образом, вывод таков: если возможно использовать события, сделайте это. С другой стороны, если вы чувствуете, что для вашего варианта использования нет доступных событий, то вполне нормально использовать OCMOD.

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

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

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

Итак, давайте сначала начнем создавать фоновые файлы.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?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 для модели продукта в каталоге Catalog . Таким образом, иерархия это model/catalog/product/getProduct . В дополнение к этому, он должен иметь префикс каталога или администратора , который обозначает приложение. В нашем случае это каталог, так как мы подключаемся к внешнему методу. Наконец, это будет пост-исправлено либо до, либо после, что говорит OpenCart о необходимости запуска нашего кода.

Третий аргумент указывает на действие вашего контроллера, которое будет запущено при возникновении события. Он настроен на custom/product/info , поэтому вам нужно будет создать контроллер Product с методом info в пользовательском каталоге, как мы это сделаем через минуту.

Наконец, метод удаления используется для удаления события во время удаления модуля.

Далее, давайте создадим языковой файл для нашего пользовательского модуля по адресу admin/language/en-gb/module/demoevent.php со следующим содержимым.

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

Мы закончили с настройкой внутреннего файла. Теперь вы должны увидеть наш модуль в разделе « Расширения»> «Модули» в серверной части OpenCart. Идите вперед и установите его. Теперь мы продолжим и создадим файлы во внешнем интерфейсе.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?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 метода getProduct модели продукта .

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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’] ?
                ‘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 .

Логика примерно такая: мы сравним дату изменения продукта в базе данных OpenCart с информацией, возвращаемой обратным вызовом API.

Поэтому первым шагом является загрузка информации о продукте в реальном времени из API. Обратите внимание, что метод api_call_to_fetch_product_info — это всего лишь фиктивный метод, который вы хотели бы заменить своим фактическим вызовом API.

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

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

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

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

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

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

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