2013-06-25 56 views
0

這些是兩個文件:覆蓋模塊,沒有結果

  1. 應用程序/代碼/核心/法師/模塊/控制器/ SubscriberController.php
  2. 應用程序/代碼/本地/馬根斯/模塊/控制器/ SubscriberController.php

我試圖重寫文件沒有(1),但沒有結果,有下面的代碼:

應用程序/代碼/本地/馬根斯/新聞/等/配置.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
     <MageNS_Newsletter> 
      <version>0.0.1</version> 
     </MageNS_Newsletter> 
    </modules> 
    <global> 
     <controllers> 
      <Mage_Newsletter> 
       <rewrite> 
        <account>MageNS_Newsletter_Controllers_SubscriberController</account> 
       </rewrite> 
      </Mage_Newsletter> 
     </controllers> 
    </global> 
</config> 

應用程序/代碼/本地/馬根斯/模塊/控制器/ SubscriberController.php

require_once("Mage/Newsletter/controllers/SubscriberController.php"); 
class MageNS_Newsletter_SubscriberController extends Mage_Newsletter_SubscriberController 
{ 
    public function test{ 
     echo "HYLlkpkdpwqkdpqkdqpkdqpkdpqkd";die; 
    } 
} 

回答

1

動作控制器被實例化並解決不同於在Magento另一個主類類型(塊,助手和模型):

  1. 重寫通過配置XML可以實現,但通過不同的機制和約定
  2. 有意設計PSR-0-like自動加載不適用於Magento中的控制器類。

有必要的覆蓋模塊的frontName下添加一個單獨的模塊的控制器目錄:

<frontend><!-- match to original module config --> 
    <routers> 
     <newsletter><!-- match to original module config--> 
      <args> 
       <modules> 
        <MageNS before="Mage_Newsletter">MageNS_Module</MageNS> 
        <!-- 
         The above points to app/code/[codePool]/MageNS/Module/controllers/ 
         If the value were MageNS_Module_Rewrites then controller matching 
         would begin in app/code/[codePool]/MageNS/Module/controllers/Rewrites/ 
        --> 
       </modules> 
      </args> 
     </newsletter> 
    </routers> 
</frontend> 

如果您在Mage_Core_Controller_Varien_Router_Standard::collectRoutes()看你會看到[其中該節點被評估添加指示目錄到原始模塊的控制器目錄前的匹配目錄列表。

附加說明:這不是顯著,但最理想包括語法父類中的定義是如下:

include Mage::getModuleDir('controllers','Mage_Newsletter').DS.'SubscriberController.php'; 
class MageNS_Newsletter_SubscriberController extends Mage_Newsletter_SubscriberController 
{ 
    //Only methods ending in 'Action' can be invoked directly via HTTP request 
    // -------------------v 
    public function testAction 
    { 
     $this->getResponse()->setBody("HYLlkpkdpwqkdpqkdqpkdqpkdpqkd"); 
    } 
}