Събитието Observer на Magento не работи и използва уеб услуги в рамките на класа 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>

И това е моят наблюдател (който е вътре в 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