在自定义模块中覆盖Magento第三方控制器

时间:2014-03-26 16:30:53

标签: php magento

我正在编写一个Magento扩展程序,试图覆盖第三方扩展程序IndexController.php,但Magento无法识别它。

我遇到与this question类似的问题,我尝试过benmarks建议,但Magento似乎仍然无视我的覆盖。

我的config.xml文件如下所示:

<?xml version="1.0"?>
<config>
    <modules>
    <Mycompany_Stores>
      <version>0.1.0</version>
    </Mycompany_Stores>
  </modules>
    <frontend>
        <routers>
            <storepickup>
                <args>
                    <modules>
                        <Mycompany_Stores before="Magestore_Storepickup">Mycompany_Stores</Mycompany_Stores>
                    </modules>
                </args>
            </storepickup>
        </routers>
    </frontend>
</config>

我的IndexController.php看起来像这样:

<?php

require_once('Magestore/Storepickup/controllers/IndexController.php');
class Mycompany_Stores_IndexController extends Magestore_Storepickup_IndexController {

    public function indexAction() {
      var_dump('asdfasdfsdf');  
      parent::indexAction();
  }
}

根据以上链接帖子的第一个建议,我收到一个错误: Fatal error: Uncaught exception 'Exception' with message 'Warning: include(Mycompany/Stores/IndexController.php) [<a href='function.include'>function.include</a>]: failed to open stream:...

但是按照第二个建议,我得到了:

["storepickup"] => array(2) {
    [0] => string(14) "Mycompany_Stores"
    [1] => string(21) "Magestore_Storepickup"
}

所以似乎有一个覆盖,但我无法弄清楚为什么我的indexAction()或任何其他方法没有被调用。

编辑:当我访问www.site.com/stores时,在我的config.xml文件中定义我自己的路线是有效的:

<stores> 
    <use>standard</use>
    <args>
        <module>Mycompany_Stores</module>
        <frontName>stores</frontName>
    </args>
</stores>

我仍然无法弄清楚为什么我的控制器没有覆盖扩展名。我已经能够覆盖同一模块中的块,而不是控制器。

2 个答案:

答案 0 :(得分:0)

根据您的诊断步骤和评论主题中的信息,您的重写应该正常。最重要的一步是使XPath正确,

["storepickup"] => array(2) {
    [0] => string(14) "Mycompany_Stores"
    [1] => string(21) "Magestore_Storepickup"
}

告诉我们您已完成此操作,并且已正确列出模块的 controllers 目录以实现覆盖。

通常我会怀疑父类indexAction()中的重定向或类似内容,但由于您直接从控制器操作var_dump()回显,因此无法设置重定向标头。不过,我倾向于执行以下三个诊断步骤:

  1. indexAction()正文更改为die(__FILE__);
  2. 您还可以通过定义自己的路径和前线名称以及以 / frontname /
  3. 的方式访问控制器来测试标准控制器功能
  4. 创建与上述相同的方法fooAction()并调用网址 / storepickup / index / foo /

答案 1 :(得分:0)

如果你还没有尝试过,我会在你的app/etc/modules/MyCompany_MyModule.xml文件中添加一个依赖标记,例如:

 ... 
        <active>true</active>
        <codePool>local</codePool>
        <depends>
            <Magestore_Storepickup/>  <!-- load after Magestore_Storepickup -->
        </depends>
 ...