2014-09-04 4 views
0

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

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

Однако я последовал за несколькими гидами. Создал мой собственный модуль (который отображается в бэк-офисе Magento: Configuration> Advanced> Modules) и наблюдатель для этого модуля. Я ничего не создал, но он не работает. Поскольку я вижу модуль в этом меню, я считаю, что проблема связана с вызовом наблюдателя/события.

Вот config.xml (который находится внутри приложения \ кода \ Local \ имен \ MyModule \ и т.д.) для моего модуля:

<?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> 

И это мой наблюдатель (который находится внутри приложения \ кода \ локальное \ имен \ 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; 
     } 

    } 
?> 

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

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

ответ

0

Я вижу некоторые проблемы с вашим 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.

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

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

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

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

0

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

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

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