2012-12-04 91 views
1

我想覆蓋Magento社區模塊中的Ajax控制器。問題是隻有當方法不存在時,我的控制器纔會被調用。我無法重寫任何重寫的控制器方法。控制器覆蓋Magento(現有方法未覆蓋)

這裏是我的代碼

config.xml文件:

<frontend> 
    <routers> 
     <overriden_module> 
      <args> 
       <modules> 
        <My_Module before="Overriden_Module">My_Module</My_Module> 
       </modules> 
      </args> 
     </overriden_module> 
    </routers> 
</frontend> 

我重寫了Ajax控制器等等 - AjaxController.php:

<?php 
require_once (Mage::getModuleDir('controllers', 'Overriden_Module') . DS .'AjaxController.php'); 

class My_Module_AjaxController extends Overriden_Module_AjaxController { 

//This is an overridden method and no hit 
public function streetAction() { 
    die('FOO'); 
} 

// This action is not overridden and gets called 
public function otherAction(){ 
    die('BAR') 
} 

} 

按照要求,這是路由部分從該模塊我凌駕:

<routers> 
     <module_name> 
      <use>standard</use> 
      <args> 
       <module>Module_name</module> 
       <frontName>frontname</frontName> 
      </args> 
     </module_name> 
     <checkout> 
      <args> 
       <modules> 
        <Module_Name before="Mage_Checkout">Module_Name_Checkout</Module_Name> 
       </modules> 
      </args> 
     </checkout> 
    </routers> 

謝謝。

+1

您列出Overriden_Module在你的模塊配置的依賴,以確保它得到你之前的裝?如果沒有,我會認爲你會遇到其他問題,但你永遠不知道。 –

+0

@Cags是的,它被列爲依賴項。我也覆蓋模型和塊。我也檢查了合併的config.xml,加載順序與它應該是一樣的。儘管感謝您的建議。 – ucaka

+0

''與此無關。其他模塊的標準路由器配置是什麼樣的? – benmarks

回答

0

好的,經過一些調試後,我發現是什麼導致了這個問題。 我正在改寫的模塊還定義了與前端名稱相同的管理路由器。當Magento搜索路由器匹配時,它將首先檢查管理路由器,並因此運行該模塊的管理控制器,甚至不檢查前端路由器。

如果你在代碼下面轉儲$this->_routers你會看到我在說什麼。

app/code/core/Mage/Core/Controller/Varien/Front.php line 174:

while (!$request->isDispatched() && $i++<100) { 
     foreach ($this->_routers as $router) { 
      if ($router->match($this->getRequest())) { 
       break; 
      } 
     } 
    } 

因此,答案是簡單地覆蓋管理控制器