Событие Magento Observer не работает и использует веб-сервисы внутри класса Observer

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

Я искал в Интернете несколько руководств по этому вопросу и обнаружил, что мне нужно использовать checkout_cart_product_add_after и checkout_cart_update_items_after.

Тем не менее, я следовал некоторым руководствам. Создал свой собственный модуль (который виден в бэк-офисе Magento: Конфигурация > Дополнительно > Модули) и наблюдатель для этого модуля. Я больше ничего не создавал, но это не работает. Поскольку я вижу модуль в этом меню, я считаю, что проблема связана с вызовом наблюдателя/события.

Вот config.xml (который находится внутри app\code\local\namespace\MyModule\etc) для моего модуля:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <namespace_MyModule>
            <version>0.1.0</version>
        </namespace_MyModule>
    </modules>
    <global>
        <events>
             <checkout_cart_product_add_after>
                   <observers>
                        <namespace_MyModule_Discount>
                           <class>MyModule/Observer</class>
                           <method>MyModulePriceChange</method>
                         </namespace_MyModule_Discount>
                    </observers>
              </checkout_cart_product_add_after>
         </events>
     </global>
</config>

А это мой Observer (который находится внутри app\code\local\namespace\MyModule\Model) для моего модуля:

<?php
    class namespace_MyModule_Model_Observer
    {
        public function MyModulePriceChange(Varien_Event_Observer $obs)
        {
            // Get the quote item
            $item = $obs->getQuoteItem();
            // Ensure we have the parent item, if it has one
            $item = ( $item->getParentItem() ? $item->getParentItem() : $item );
            // Load the custom price
            $price = $this->_getPriceByItem($item);
            // Set the custom price
            $item->setCustomPrice($price);
            $item->setOriginalCustomPrice($price);
            // Enable super mode on the product.
            $item->getProduct()->setIsSuperMode(true);
        }

        protected function _getPriceByItem(Mage_Sales_Model_Quote_Item $item)
        {
            $price = 4;

            //use $item to determine your custom price.

            return $price;
        }

    }
?>

Кроме того, возможно ли вызвать мыльный клиент для использования веб-сервиса внутри наблюдателя?

Надеюсь, мой вопрос понятен, заранее спасибо за помощь.


person Bruno Américo    schedule 04.09.2014    source источник


Ответы (2)


Я вижу некоторые проблемы с вашим config.xml. Прежде всего, используйте заглавные буквы как для названия компании, так и для модуля. namespace_MyModule станет вашим пространством имен. Вы должны объявить модели в глобальном разделе следующим образом:

<models>
    <mycompany_mymodule>
        <class>Mycompany_Mymodule_Model</class>
    </mycompany_mymodule>
</models>

Это сообщит magento, что вы хотите использовать mycompany_mymodule для моделей в вашем модуле, а имя класса каждого модуля будет начинаться с Mycompany_Mymodule_Model. Где Mycompany и Mymodule соответствуют папкам вашего модуля: app/code/local/Mycompany/Mymodule.

Раздел modules файла config.xml также должен иметь это пространство имен (Mycompany_Mymodule), совпадающее с именем вашего файла app/etc/modules и структурой папок в app/code/local.

Затем наблюдатели становятся следующими (я добавил тип и изменил класс):

<observers>
    <namespace_MyModule_Discount>
        <type>singleton</type>
        <class>mycompany_mymodule/Observer</class>
        <method>MyModulePriceChange</method>
    </namespace_MyModule_Discount>
</observers>

Затем попробуйте протестировать свой метод наблюдателя, добавив туда какой-нибудь код вроде die("message").

person nevermourn    schedule 04.09.2014

Вы не объявили тег модели в файле config.xml. В конце концов, наблюдатель - это модель, и magento не будет знать, где ее найти (этот MyModule/Observer, на который вы ссылаетесь). Ниже приведен пример объявления тега модели:

<models>
   <MyModule>
      <class>Namespace_Modulename_Model</class> 
   </MyModule>
</models>

Да, вы можете делать вызовы API мыла внутри наблюдателя.

person Bogdan Constantinescu    schedule 04.09.2014