2013-10-14 4 views
0

Я хочу создать событие для экспорта инвентаря, когда статус заказа будет изменен на завершенный.Magento create custom event (order_status_changed)

Я создал модуль для перезаписи Mage_Sales_Model_Order и попытался сгенерировал событие

(sales_order_status_change).

Когда из панели администратора magento я просматриваю и заказываю и изменяю состояние заказа для завершения, это означает, что печать означает что-то в моем расширенном классе, это показывает, что это прекрасно. Здесь я генерирую событие. (Проблема может быть здесь, может быть событие не сгенерировано)

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

Но в том же классе наблюдателя, если вы меняете конфигурацию и наблюдаете какое-то другое событие (из Magento, встроенного в события), он работает. Как я испытал catalog_controller_product_view

Здесь мой модуль генератора событий.

приложение/и т.д./модули/Gol_Eventgenerator.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
    <Gol_Eventgenerator> 
     <active>true</active> 
     <codePool>local</codePool> 
    </Gol_Eventgenerator> 
    </modules> 
</config> 

приложение \ код \ Local \ Gol \ Eventgenerator \ и т.д. \ config.xml

<?xml version="1.0" encoding="utf-8"?> 
<config> 
    <modules> 
     <Gol_Eventgenerator> 
      <version>0.1.0</version> 
     </Gol_Eventgenerator> 
    </modules> 
    <global> 
     <models> 
      <sales> 
       <rewrite> 
        <order>Gol_Eventgenerator_Model_Order</order> 
       </rewrite> 
      </sales> 
     </models> 
    </global> 
</config> 

приложение \ код \ Local \ Gol \ Eventgenerator \ Model \ Order.php

<?php 
class Gol_Eventgenerator_Model_Order extends Mage_Sales_Model_Order 
{ 
    public function setState($state, $status = false, $comment = '', $isCustomerNotified = null) 
    { 
     //if I print something here and exit, it does will. 
     Mage::dispatchEvent('sales_order_status_change', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified)); 
     return parent::setState($state, $status, $comment, $isCustomerNotified); 
    } 
} 

Здесь детали модуля наблюдателя

приложение/и т.д./модули/Gol_Inventory.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
    <Gol_Inventory> 
     <active>true</active> 
     <codePool>local</codePool> 
    </Gol_Inventory> 
    </modules> 
</config> 

приложение \ код \ Local \ Gol \ Inventory \ и т.д. \ config.xml

<?xml version="1.0" encoding="utf-8"?> 
<config> 
    <modules> 
     <Gol_Inventory> 
      <version>0.1.0</version> 
     </Gol_Inventory> 
    </modules>   
    <global>   
     <events> 
      <sales_order_status_change> 
       <observers> 
        <Gol_Inventory_observer> 
         <type>singleton</type> 
         <class>Gol_Inventory_Model_Observer</class> 
         <method>exportEnventory</method> 
        </Gol_Inventory_observer> 
       </observers> 
      </sales_order_status_change> 
     </events> 
    </global> 
</config> 

приложение \ код \ Local \ Gol \ Inventory \ Model \ Observer.php

<?php 
class Gol_Inventory_Model_Observer 
{ 
    public function exportEnventory($observer) 
    { 
     echo "Inside exportEvnentory method"; 
     exit; 
     //$order = $observer->getEvent()->getOrder(); 
     //$state = $observer->getEvent()->getState(); 
     //$status = $observer->getEvent()->getStatus(); 
    } 
} 

Есть ли разница в способе генерации событий для интерфейса и администратора? кроме

, в файле конфигурации.

Извините, если я не выполнил некоторые очень распространенные вещи. Новое для пурпурного.

Я попытался следовать.

THis

+1

вам не нужно, чтобы создать событие для этого, наблюдать 'sales_order_save_before' и проверить новый статус с предыдущим – OSdave

+0

Спасибо большое! какие атрибуты я получу от $ observer ?? и когда это событие будет уволено? при размещении заказа с лицевой стороны? или когда статус заказа изменился? или оба?? – sohail042414

+0

Я попытался, sales_order_save_before уволен с обеих сторон. но я хочу событие, которое должно быть запущено только при завершении изменений статуса заказа. ** Любая идея ?? ** – sohail042414

ответ

0

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

public function exportEnventory(Varien_Event_Observer $observer) 
    { 
     $status = $observer->getEvent()->getOrder()->getStatus(); 
     $originalData = $observer->getEvent()->getOrder()->getOrigData(); 
     $previousStatus = $originalData['status']; 

     if (($status !== $previousStatus) && ($status == Mage_Sales_Model_Order::STATE_COMPLETE)) { 
      //do something when the order changes to status complete 
     } 
    } 

редактировать: и в вашем конфиге.XML

<?xml version="1.0" encoding="utf-8"?> 
<config> 
    <modules> 
     <Gol_Inventory> 
      <version>0.1.0</version> 
     </Gol_Inventory> 
    </modules>   
    <global>   
     <events> 
      <sales_order_save_after> 
       <observers> 
        <Gol_Inventory_observer> 
         <type>singleton</type> 
         <class>Gol_Inventory_Model_Observer</class> 
         <method>exportEnventory</method> 
        </Gol_Inventory_observer> 
       </observers> 
      </sales_order_save_after> 
     </events> 
    </global> 
</config> 
+0

да это нормально, но я хочу создать модуль, как я могу вызвать свой модуль? не можем ли мы создать пользовательское событие в magento ??? – sohail042414

+0

Я отредактировал свой ответ, чтобы включить объявление наблюдателя. вы можете создавать собственные события в magento, но нет смысла делать это за то, что вы хотите сделать. И поскольку это связано с переопределением, я бы не рекомендовал его. – OSdave

+0

Получил это. Благодарю. – sohail042414