Учитывая число доступных на рынке фреймворков электронной коммерции, 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.
Пожалуйста, не стесняйтесь оставлять вопросы и / или комментарии в форме ниже!