2012-01-10 90 views
3

我試圖寫當訂單已標記爲已發貨,並已經獲得一個跟蹤號碼將被觸發Magento的觀察員。定製觀察者未觸發

當我通過管理員進入並下訂單,發票,然後去發送我需要調用的函數從來沒有實際調用,我不明白爲什麼。

我已經瀏覽了magento網站上的兩個頁面,看看我可能會做錯什麼,但我不知道它是什麼(http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method & http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-2-the-magento-config)。

請注意,我確實看到了先進的管理區域內的模塊,它被啓用。

如果任何人都可以在看我重視的代碼,讓我知道我的問題是,這將是大加讚賞。

這裏是位於應用程序/代碼/本地/ WR我的觀察類/ TrackingEmail /型號/ Observer.php

class WR_TrackingEmail_Model_Observer 
{ 
    public function sendTrackEmail($observer) 
    { 
     $track = $observer->getEvent()->getTrack(); 
     $shipment = $track->getShipment(true); 
     $shipment->sendEmail(); 
    } 
} 

這裏是我的config.xml文件模塊

<config> 
    <global> 
     <modules> 
      <wr_trackingemail> 
       <version>0.1.1</version> 
      </wr_trackingemail> 
     </modules> 
     <events> 
      <sales_order_shipment_track_save_after> 
       <observers> 
        <Wr_trackingemail_model_observer> 
         <type>singleton</type> 
         <class>WR_TrackingEmail_Model_Observer</class> 
         <method>sendTrackEmail</method> 
        </Wr_trackingemail_model_observer> 
       </observers> 
      </sales_order_shipment_track_save_after> 
     </events> 
    </global> 
</config> 

這裏是我的應用程序的/ etc /模塊/ WR_TrackingEmail.xml

<config> 
    <modules> 
     <WR_TrackingEmail> 
      <active>true</active> 
      <codePool>local</codePool> 
     </WR_TrackingEmail> 
    </modules> 
</config> 
+0

」下的''節點將不會被評估,但它也不會對任何不利影響。 – benmarks 2012-01-10 19:34:28

+0

結果是什麼? – 2012-01-10 20:03:14

回答

11

您的陳述「自定義觀察者未被觸發」留下了很多解釋空間。以下是您要查看的內容。

您的觀察者似乎設置正確(儘管模塊標記屬於全局標記之外,但對於這種情況似乎並不重要)。你可以自己從一個空白的控制器動作(或其它自舉,事件時加載的,Magento的腳本)

Mage::dispatchEvent('sales_order_shipment_track_save_after'); 

,然後更換運行下面的代碼測試您的設置您的sendTrackEmail這個

public function sendTrackEmail($observer) 
{ 
    exit(__METHOD__); 
} 

如果執行暫停與文本

WR_TrackingEmail_Model_Observer::sendTrackEmail 

你會知道你的事件配置正確。

如果活動配置正確,下一步是確保當您執行上述步驟的情況實際上是被解僱。您可以通過添加此臨時日誌代碼

public static function dispatchEvent($name, array $data = array()) 
{ 
    //brain dead logging 
    file_put_contents('/tmp/events.log',"$name\n",FILE_APPEND); 
    Varien_Profiler::start('DISPATCH EVENT:'.$name); 
    $result = self::app()->dispatchEvent($name, $data); 
    #$result = self::registry('events')->dispatch($name, $data); 
    Varien_Profiler::stop('DISPATCH EVENT:'.$name); 
    return $result; 
} 

此外,還有一個很好的機會,讓你的出口在上面仍然會導致執行暫停,如果被解僱的事件日誌中app/Mage.php這些事件。

如果您確定您的觀察員配置正確,並且您的事件正在被解僱,那麼問題不是被觸發的事件,而是您的觀察員代碼沒有按照您的想法行事。重新添加代碼,但讓你退出到位

class WR_TrackingEmail_Model_Observer 
{ 
    public function sendTrackEmail($observer) 
    { 
     $track = $observer->getEvent()->getTrack(); 
     $shipment = $track->getShipment(true); 
     $shipment->sendEmail(); 
     exit(__METHOD__); 
    } 
} 

這將讓你一遍遍刷新瀏覽器再次測試你的觀察代碼。祝你好運!

1

有您註冊模塊下3210在.xml文件?

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Wr_Trackingemail> 
      <active>true</active> 
      <codePool>local</codePool> 
     </Wr_Trackingemail> 
    </modules> 
</config> 
+0

是的,我有。我甚至使用過你的例子,以防萬一我有一個問題。仍然沒有工作... – Jen 2012-01-10 19:16:01

+0

我有一個錯誤(剛剛更正)。你清除了配置緩存嗎?你是否在覈心中觸發了事件後添加了一個簡單的'die;',並且在觀察者中添加了一個'die',以確定該應用是否正在實例化它? – benmarks 2012-01-10 19:36:40