0

这是两个文件:

  1. app/code/core/Mage/Module/controllers/SubscriberController.php
  2. app/code/local/MageNS/Module/controllers/SubscriberController.php

我试图覆盖文件号(1),但没有结果,还有下一个代码:

app/code/local/MageNS/Newsletter/etc/config.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> 

app/code/local/MageNS/Module/controllers/SubscriberController.php

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

1 回答 1

1

动作控制器的实例化和解析方式与 Magento 中的其他主要类类型(块、助手和模型)不同:

  1. 可以通过配置 XML 重写,但通过不同的机制和约定
  2. Magento 中的控制器类通过有意设计PSR-0的自动加载功能不起作用。

有必要在被覆盖模块的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");
    }
}
于 2013-06-25T12:54:11.950 回答