在社区extention重写Magento的控制器(Overriding a Magento Con

2019-08-19 13:06发布

我有我的Magento 1.7商店安装CreativeStyle CheckoutByAmazon扩展,我试图重写CheckoutController类,但Magento的似乎忽略我的覆盖。 任何建议将非常感激。 也被清除缓存,但仍然不工作

(在应用程序/代码/本地文件夹)

MyModule的\ CheckoutByAmazon \控制器\ CheckoutController.php \等\ config.xml中

(应用程序的/ etc / config.xml中)

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyModule_CheckoutByAmazon>
            <version>0.1.0</version>
        </MyModule_CheckoutByAmazon>
    </modules>
    <frontend>
        <routers>
            <checkoutbyamazon>
                <args>
                    <modules>
                        <MyModule_CheckoutByAmazon before="Creativestyle_CheckoutByAmazon">MyModule_CheckoutByAmazon</MyModule_CheckoutByAmazon>
                    </modules>
                </args>
            </checkoutbyamazon>
        </routers>
    </frontend>
</config>

(在应用程序/代码/本地/ MyModule的/ CheckoutByAmazon /控制器/ CheckoutController)

<?php
//Controllers are not autoloaded so we will have to do it manually:
require_once 'Creativestyle/CheckoutByAmazon/controllers/CheckoutController.php';

class MyModule_CheckoutByAmazon_CheckoutController extends Creativestyle_CheckoutByAmazon_CheckoutController {

    public function indexAction() {
       exit('I am here');
        parent::indexAction();
    }

    //i want to override this function
      public function saveShippingAction() {
       //insert my overriding code
        exit('saveShipping');
        }

}
?>

(在等/模块/ MyModule_CheckoutByAmazon.xml)

<?xml version="1.0"?>
<config>
    <modules>
        <MyModule_CheckoutByAmazon>
            <active>true</active>
            <codePool>local</codePool>
        </MyModule_CheckoutByAmazon>
    </modules>
</config>

我要去哪里错了?

Answer 1:

TL;博士:原分机配置是有可能的问题,但这里是如何解决。

为了开始调试,有必要了解你正在尝试做的。 在不以任何存在的自定义模块,Magento的将采取请求路径frontname“结帐”时,它匹配到目录./app/code/core/Mage/Checkout/controllers/,然后寻找一个匹配的第二和第三参数的作为文件,在该文件中的类定义,在这类操作方法的组合。 非过时的重写语法(正尝试用你的模块来执行)只是增加了匹配其他目录 。 调试此之前,最好覆盖的基础知识。 这就提出了一个很好的机会,调试控制器覆盖。

有一些必须满足(你的模块的config.xml越来越合并,正确的语法和文件结构等)的前提条件。 这是很好的测试,这些都是第一次合作,因为这将减少并确定我们需要调试的区域。

在你的Magento根test.php的文件,请执行以下操作:

<?php
ini_set('display_errors',1);
error_reporting(E_ALL^E_STRICT);
include 'app/Mage.php';
Mage::setIsDeveloperMode(true);
Mage::app();

$origDir = Mage::getModuleDir('controllers','Creativestyle_CheckoutByAmazon').DS;
require_once $origDir.'CheckoutController.php';

$controller = new MyModule_CheckoutByAmazon_CheckoutController(
    Mage::app()->getRequest(),    //required constructor arg
    Mage::app()->getResponse()    //required constructor arg
);

echo get_class($controller);

访问yoursite.com/test.php,你应该看到你的控制器类的名字。 如果你看到一个错误,或者你什么也看不到,一些相当低的水平被打破。 如果错误信息是直观,请检查您的模块配置被合并,并从那里移动。

如果类实例化,我们知道以下内容:

  1. 基本模块的配置还是不错的
  2. 文件结构是适当的配置
  3. 显式包括好

我的猜测是,你会走到这一步,因为我相信被配置为基础的问题。 有几种可能性。 为了深入了解,修改test.php的以下(假定PHP> = 5.3):

<?php
ini_set('display_errors',1);
error_reporting(E_ALL^E_STRICT);
include 'app/Mage.php';
Mage::setIsDeveloperMode(true);
Mage::app();

$router = Mage::app()->getFrontController()->getRouter('standard');
/* @var $router Mage_Core_Controller_Varien_Router_Standard */

$reflection = new ReflectionClass($router);
$modules = $reflection->getProperty('_modules');
$modules->setAccessible(true);

var_dump($modules->getValue($router));

输出应该类似于像下面这样:

array(35) {
  ["core"]=>
  array(1) {
    [0]=>
    string(9) "Mage_Core"
  }
  ["install"]=>
  array(1) {
    [0]=>
    string(12) "Mage_Install"
  }
  ["directory"]=>
  array(1) {
    [0]=>
    string(14) "Mage_Directory"
  }
  // ...
  ["checkout"]=>
  array(2) {
    [0]=>
    string(25) "MyModule_CheckoutByAmazon"
    [1]=>
    string(13) "Mage_Checkout"
  }
  // ...
}

无论你在哪里看到不止一个子阵列,还有一个控制器,目录重写。



Answer 2:

要完成C4rter的答案,这里是你必须添加到您的config.xml文件的完整代码:

<admin>
    <routers>
        <checkoutbyamazon>
            <args>
                <modules>
                    <MyModule_CheckoutByAmazon before="Creativestyle_CheckoutByAmazon_Adminhtml">MyModule_CheckoutByAmazon</MyModule_CheckoutByAmazon>
                </modules>
            </args>
        </checkoutbyamazon>
    </routers>
</admin>

你不需要前端改写部。



Answer 3:

试图做同样的,也失败了。 但我找到了原因。 该CheckoutByAmazon扩展具有相同名称的admincontroller:

<admin>
    <routers>
        <checkoutbyamazon>
            <use>admin</use>
            <args>
                <module>Creativestyle_CheckoutByAmazon</module>
                <frontName>checkoutbyamazon</frontName>
            </args>
        </checkoutbyamazon>
    </routers>
</admin>

所以,你必须重写管理控制器:

before="Creativestyle_CheckoutByAmazon_Adminhtml"


文章来源: Overriding a Magento Controller in community extention