2012-01-26 27 views
2

我讀了很多關於Magento自定義模塊創建的文檔。我錯在哪裏使用Magento的觀察者模式?

對於我的拳頭嘗試,我創建使用Module Creator模塊結構,這是我在/app/code/local/Test/MyModule/etc/config.xml添加的代碼:

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Test_MyModule> 
      <version>0.1.0</version> 
     </Test_MyModule> 
    </modules> 
    <!-- frontend, admin, adminhtml --> 
    <global> 
     <!-- models, resources, blocks, helpers --> 
     <events> 
      <sales_order_place_before> <!-- event i need to catch --> 
      <observers> 
       <trigger_mymodule_placeorder> 
       <type>model</type> 
       <class>test/mymodule/model_observer</class> 
       <method>sendOrder</method> 
       </trigger_mymodule_placeorder> 
      </observers> 
      </sales_order_place_before> 
     </events> 
    </global> 
</config> 

/app/etc/modules/Test_MyModule.xml文件:

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

這是我/app/code/local/Test/MyModule/Model/Observer.php

<?php 
class Test_MyModule_Model_Observer 
{ 
    public function sendOrder() 
    { 
     // do something. 
    } 
} 

。但是Test_MyModule_Model_Observer :: sendOrder()函數從來沒有被觸發(我嘗試在它內部放入一個虛擬數據庫記錄器來查看函數是否被執行)。

我知道模塊本身是正確加載的,因爲在模塊的config.xml中,它在主菜單中聲明瞭一個新鏈接並且鏈接顯示正確(沖洗了magento的緩存之後),所以我猜問題是函數命名約定,我失蹤的地方..但在哪裏?

回答

3

你有兩個問題,我可以看到,這兩個問題都是相關的。您使用Mage :: getModel接受的語法來指定要使用的類,但是您的語法稍微有點錯誤,b。)似乎並未實際聲明模型的包含位置(除非您將其取出以便更簡潔)。

您需要將模型添加到全局節點中。

<models> 
    <testmodule> 
     <class>Test_MyModule_Model</class> 
    </testmodule> 
<models> 

的testmodule部分可以是你喜歡的東西,只要它是你的模塊是唯一的。在觀察者一部分,那麼將成爲使用的類值...

<class>testmodule/observer</class> 
+1

此外,我建議公共職能sendOrder()接受$觀察員的說法,所以這將是公共職能sendOrder($觀察員) –

+0

不嚴格要求,但你是正確的,它肯定會增加更多的清晰度。 –

+0

工作就像一個魅力! @JevgeniSmirnov是的,你是對的,在真正的功能,我會採取觀察員的參數做功能需要做的;我發佈的功能只是一個例子;) – Strae