2013-10-14 90 views
0

我想創建一個事件,以便在訂單狀態更改爲完成時導出庫存。Magento創建自定義事件(order_status_changed)

我創建模塊覆蓋Mage_Sales_Model_Order並試圖產生的事件

(sales_order_status_change)。

當從magento管理面板我查看和命令和更改順序狀態完成,它的作品意味着打印我的擴展類中的東西,它顯示,它的罰款。這裏我產生了事件(問題可能在這裏,可能不會產生事件)

我創建了另一個模塊來觀察這個事件。但是我無法進入我的Observer類。我無法打印任何內容並退出,這意味着代碼無法運行。

但是在同一個觀察者類中,如果改變配置並觀察其他事件(來自Magento內置的事件),它就可以工作。像我測試catalog_controller_product_view

這裏是我的事件發生器模塊。

應用的/ etc /模塊/ Gol_Eventgenerator.xml

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

應用\代碼\本地\高爾\ 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> 

應用\代碼\本地\高爾\ Eventgenerator \型號\ 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); 
    } 
} 

這裏是觀測器模塊的細節

應用的/ etc /模塊/ Gol_Inventory.xml

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

應用\代碼\本地\高爾\庫存\等\ 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> 

應用\代碼\本地\高爾\庫存\ 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(); 
    } 
} 

生成前端和管理事件的方式有什麼不同嗎?除了

,在配置文件中。

對不起,如果我沒有遵循一些很常見的事情。新的magento。

我試圖關注。

THis

+1

你不需要爲創建活動,觀察'sales_order_save_before',並與前一個 – OSdave

+0

感謝檢查新的狀態了很多!我將從$觀察者獲得哪些屬性? 當這個事件將被解僱?當訂單從前端放置時?或當訂單狀態更改形式管理員?或兩者?? – 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