Event/Observer в Magento

в 8:08, , рубрики: Events, Magento, Observer, php, электронная коммерция, метки: , , ,

Привет! Хотел бы поделиться с тобой небольшой заметкой по кастомизации Magento. С данной системой работаю не так давно, но уже успел написать несколько модулей(модуль платёжной системы, добавление custom-полей, etc.). Сама система предлагает несколько способов модификации своего поведения:

  1. Переписывание классов в самой системе
  2. Копирование из app/code/core в app/code/local с последующим изменением
  3. Rewrite через XML файл модуля с наследованием родительского класса
  4. Система событий(Event) и наблюдателей(Observer)

В данном посте я расскажу о способе применения последнего метода. За подробностями прошу под кат.

Описание модуля

Описание задаётся в файле app/etc/modules/NameSpace_ModuleName (в нашем случае VA_AddOneDollarToPrice.xml) минимальный файл:

<?xml version="1.0"?>
<config>
    <modules>
        <VA_AddOneDollarToPrice>
            <active>true</active>
            <codePool>community</codePool>
        </VA_AddOneDollarToPrice>
    </modules>
</config>

Формат файл:

<config>

— Декларация того, что это конфиг

<modules>

— Объявление того, что это модуль

<VA_AddOneDollarToPrice>

— Имя модуля в формате NameSpace_ModuleName

<active>true</active>
<codePool>community</codePool>

— Включаем наш модуль и указываем на то, что модуль будет находиться в папке /app/code/community

Конфигурация модуля

Описание задаётся в файле app/code/community/NameSpace/ModuleName/etc/config.xml (в нашем случае VA_AddOneDollarToPrice.xml):

<?xml version="1.0"?>
<config>
    <modules>
        <VA_AddOneDollarToPrice>
            <version>0.1.0</version>
        </VA_AddOneDollarToPrice>
    </modules>
    <global>
        <models>
            <addonedollartoprice>
                <class>VA_AddOneDollarToPrice_Model</class>
            </addonedollartoprice>
        </models>
        <events>
        	<catalog_product_get_final_price>
        		<observers>
                    <add_one_dollar_to_price>
                        <class>addonedollartoprice/observer</class>
                        <method>AddOneDollarToPrice</method>
                    </add_one_dollar_to_price>
                </observers>
        	</catalog_product_get_final_price>
        </events>
    </global>
</config>

Корневой элемент такой же, как и в описании модуля. Далее у нас идут:

<VA_AddOneDollarToPrice>
     <version>0.1.0</version>
</VA_AddOneDollarToPrice>

— Название и версия модуля. Версия впоследствии может использоваться для обновления базы.

<global>
       ...
</global>

— Глобальные настройки, доступные в frontend и backend.

<models>
      <addonedollartoprice>
            <class>VA_AddOneDollarToPrice_Model</class>
      </addonedollartoprice>
</models>

— Описание местоположения нашей модели, в нашем случае папка app/code/community/VA/AddOneDollarToPrice/

<events>
        ...
</events>

— Описание перехватываемых событий

<catalog_product_get_final_price>
       ...
</catalog_product_get_final_price>

— Событие, которое перехватываем

<observers>
      <add_one_dollar_to_price>
               <class>addonedollartoprice/observer</class>
               <method>AddOneDollarToPrice</method>
      </add_one_dollar_to_price>
</observers>

— Наш наблюдатель. add_one_dollar_to_price — наше событие, addonedollartoprice/observer — класс с нашим наблюдателем, AddOneDollarToPrice — наблюдатель, который сработает по событию catalog_product_get_final_price.

Наблюдатель

<?php
class VA_AddOneDollarToPrice_Model_Observer
{
	public function AddOneDollarToPrice($observer) {
		$event = $observer->getEvent();
		$product = $event->getProduct();   
		// добавляем доллар к простым продуктам    
		if ($product->getSuperProduct() && $product->getSuperProduct()->isConfigurable()) {
		} else {
			$product->setFinalPrice($product->getPrice()+1);
		}
		
		return $observer;
	}
}

Класс достаточно прост. Сначала создаём функцию, которую объявили в конфигурационном файле. Когда вызывается событие в наблюдатель попадает объект с данными события. Далее получаем данные продукта и если это простой товар, то добавляем доллар(ну или другую единицу валюты).

Заключение

Подобным образом можно перехватить любое выбрасываемое событие. Если материал заинтересовал, то далее могу рассказать про то, как эти самые события бросать, пример модуля оплаты, расширения SOAP magento.
P.S.Если нашли неточности или ошибки, то буду рад исправить.

Автор: vaail

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js