2011-01-08 49 views
2

爲什麼控制器操作預分派事件在控制器重寫時不會觸發?這裏是store/app/code/core/Mage/Core/Controller/Varien/Action.php一個片段:Magento:如果控制器被重寫,爲什麼控制器動作預調度事件不會觸發?

abstract class Mage_Core_Controller_Varien_Action 
{ 
    // [...] 
    public function preDispatch() 
    { 
     // [...] 
     if ($this->_rewrite()) { 
      return; // [What is the purpose if this?] 
     } 
     // [...] 

     // [This is where my event needs to be firing, but this code never gets 
     // executed because the controller is rewritten] 
     Mage::dispatchEvent(
      'controller_action_predispatch_'.$this->getFullActionName(), 
      array('controller_action'=>$this) 
     ); 

    } 
    // [...] 
} 

我不知道從哪裏開始解決這個問題。以前有誰曾經處理過這個問題?

+0

afaik您甚至不能在magento中重寫抽象模型?只能在地方/法師中將它們全部取代? – 2011-01-09 22:27:20

回答

5

沒有時間來測試您描述的行爲是否準確,但如果是這樣的話,我想這是_rewrite函數中發生的情況,在該調用之後複製了其他非事件代碼的操作,並允許preDispatch繼續重寫之後會讓「壞事」發生。

換句話說,這是執行控制器重寫時的一個錯誤,它被忽略了,因爲處理這個錯誤的首選方式現在是the routing level。一般來說,當像這樣的系統級錯誤進入Magento時,它往往會停留在那裏,因爲購物車所有者開始依靠破碎的行爲並在更改任何東西時大聲尖叫,即使它是一個錯誤修復。

如果您不能像上面的鏈接中描述的那樣重新考慮您的解決方案,您仍然可以使用舊式時尚面向對象編程在控制器類中自己觸發事件。將以下內容添加到您的自定義控制器(您正在改寫的那個)

protected function _rewrite() 
{ 
    //call the parent rewrite method so every that needs 
    //to happen happens 
    $original_result = parent::_rewrite(); 

    //fire the event ourselve, since magento isn't firing it 
    Mage::dispatchEvent(
     'controller_action_predispatch_'.$this->getFullActionName(), 
     array('controller_action'=>$this) 
    );  

    //return the original result in case another method is relying on it 
    return $original_result; 
} 
2

嘿,我不確定(因爲我不是很熟悉Magento的內部工作原理),但我發現_rewrite()檢查是否正在重定向對此特定操作的調用(用mod_rewrite重寫以某種方式)到不同的控制器/動作。在這種情況下,最初的行動事件不會被解僱,因爲整個請求都是通過不同的行動來處理的。

相關問題