Статьи

Пользовательские события в Magento с шаблоном Observer

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

Хотя существует множество сторонних расширений для Magento, также легко разработать собственное. Цель этого урока не в том, чтобы узнать, как создать собственное расширение; однако предполагается, что вы знакомы с процессом, поскольку мы будем использовать шаблон проектирования для реализации нашего собственного пользовательского модуля.

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

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

Во-первых, нам нужно объявить наблюдателя для нашего пользовательского события. Для этого введите следующий код в файл config.xml вашего модуля прямо внутри глобального элемента.

Мы объясним код на мгновение.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<global>
  ..
  ..
  <events>
    <my_custom_event>
      <observers>
        <namespace_modulename_my_custom_event_observer>
          <type>singleton</type>
          <class>modulename/observer</class>
          <method>my_custom_method</method>
        </namespace_modulename_my_custom_event_observer>
      </observers>
    </my_custom_event>
  </events>
  ..
  ..
</global>

В приведенном выше коде мы только что объявили наблюдателя для события my_custom_event . Это просто означает, что всякий раз, когда my_custom_event , он видит, что наблюдатель для этого события зарегистрирован в вашем модуле, а затем выполняет код, связанный с событием.

В нашем случае это вызовет метод my_custom_method определенный в классе Namespace_Modulename_Model_Observer .

Теперь давайте сделаем этот шаг дальше. Обратите внимание, что в <events> вы можете определить события, для которых вы хотите зарегистрировать наблюдателей. В нашем случае мы зарегистрировали наблюдателя для события <my_custom_event> . Вы также можете определить несколько наблюдателей для одного и того же события. В этом случае объявите всех своих наблюдателей внутри <observers> .

Далее каждый наблюдатель оборачивается уникальным идентификатором. В нашем примере это <namespace_modulename_my_custom_event_observer> . Кроме того, вам нужно указать имя класса и имя метода, который будет выполняться. Тег <class> указывает местоположение класса в соответствии с соглашением Magento.

В нашем примере это будет Observer.php в каталоге modulename модуля modulename . Имя метода объявляется тегом <method> . Значение <type> равно «singleton», что означает, что он будет использовать один и тот же экземпляр объекта-наблюдателя для каждого вызова события.

Теперь, после объявления нашего наблюдателя, давайте создадим класс наблюдателя и связанный код метода. Создайте файл Observer.php в каталоге Model вашего модуля. Скопируйте и вставьте следующий код в этот файл.

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
class Namespace_Modulename_Model_Observer
{
  public function my_custom_method($observer) {
    $event = $observer->getEvent();
 
    // getter method to fetch cid value passed from the dispatcher
    $cid = $event->getCid();
    echo $cid;
    exit;
  }
}
?>

Здесь мы только что создали класс наблюдателя. В методе my_custom_method вас будет доступ к объекту-наблюдателю и данным, передаваемым вместе с ним диспетчером, чтобы вы могли использовать его для выполнения чего-то значимого.

В этом примере мы только что получили значение переменной cid переданное из кода диспетчера, который мы увидим чуть позже.

Конечно, вам нужно изменить имя modulename и namespace соответствии с вашим пользовательским модулем в файле класса и объявлении XML.

Как мы объявили наблюдателя в пользовательском модуле, остается только отправить наше пользовательское событие.

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

1
2
3
4
5
6
<?php
..
$event_data_array = array(‘cid’ => ‘123’);
Mage::dispatchEvent(‘my_custom_event’, $event_data_array);
..
?>

Как вы можете видеть, довольно просто отправить событие практически из любой точки Magento. Первый аргумент метода dispatchEvent — это имя события, а второй аргумент используется для передачи данных наблюдателям.

Как вы могли заметить ранее в классе наблюдателя, мы использовали метод getter для доступа к значению переменной cid .

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

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

01
02
03
04
05
06
07
08
09
10
11
<?php
..
$event_data_array = array(‘cid’ => ‘123’);
$varien_object = new Varien_Object($event_data_array);
Mage::dispatchEvent(‘my_custom_event’, array(‘varien_obj’=>$varien_object));
 
// should output ‘456’ as we’ll change the value in observer
echo $varien_object->getCid();
..
..
?>

Мы только что использовали специальный объект из Magento Varien_Object и передали наши данные, используя его, чтобы гарантировать сохранение любых изменений данных.

Вам также необходимо изменить код класса наблюдателя соответственно. Вот модифицированный класс наблюдателя.

01
02
03
04
05
06
07
08
09
10
11
12
<?php
class Namespace_Modulename_Model_Observer
{
  public function my_custom_method($observer) {
    $event = $observer->getEvent();
 
    // getter method to fetch varien object passed from the dispatcher
    $varien_object = $event->getVarienObj();
    $varien_object->setCid(‘456’);
  }
}
?>

Единственное существенное изменение в коде — выборка объекта varien и использование его для изменения значения переменной массива cid .

Хотя это относительно простое руководство, оно показывает, как мы можем легко реализовать шаблон Event-Observer в контексте пользовательского модуля Magento. На этом этапе вы должны быть знакомы с созданием собственных пользовательских модулей с использованием шаблона Event-Observer.

Пожалуйста, не стесняйтесь оставлять вопросы и / или комментарии в форме ниже!