use*_*826 3 overriding controller magento
我在我的magento 1.7商店安装了扩展CreativeStyle CheckoutByAmazon,我试图覆盖CheckoutController类但是magento似乎忽略了我的覆盖.任何建议将不胜感激.还清除缓存但仍然无法正常工作
(在app/code/local文件夹中)
MyModule\CheckoutByAmazon\controllers\CheckoutController.php\etc\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>
Run Code Online (Sandbox Code Playgroud)
(在app/code/local/MyModule/CheckoutByAmazon/controllers/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');
}
}
?>
Run Code Online (Sandbox Code Playgroud)
(在etc/modules/MyModule_CheckoutByAmazon.xml中)
<?xml version="1.0"?>
<config>
<modules>
<MyModule_CheckoutByAmazon>
<active>true</active>
<codePool>local</codePool>
</MyModule_CheckoutByAmazon>
</modules>
</config>
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
tl; dr:原始扩展配置可能是问题,但这里是如何排除故障.
为了开始调试,有必要了解您要做的事情.在不以任何存在的自定义模块,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);
Run Code Online (Sandbox Code Playgroud)
访问yoursite.com/test.php,您应该会看到您的控制器类名称.如果你看到一个错误,或者你什么也看不到,那么相当低级的东西就会被打破.如果错误消息不直观,请检查您的模块配置是否正在合并并从那里移动.
如果类实例化,我们知道以下内容:
我怀疑你会做到这一点,因为我认为这个问题是基于配置的.有几种可能性.要获得洞察力,请将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));
Run Code Online (Sandbox Code Playgroud)
输出应类似于以下内容:
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"
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
无论您在哪里看到多个子阵列,都会有一个控制器目录重写.
| 归档时间: |
|
| 查看次数: |
3192 次 |
| 最近记录: |