我想做上述事情。 我已经覆盖了过去的许多文件......块,模型,助手......但是这个文件让我望而却步。
任何人都可以在这里看到我做错了什么: (香港专业教育学院编辑了这段代码......现在包括一些建议......)
继承我的文件夹结构(2个控制器位置作为测试):
/Idigital/Idgeneral/etc/config.xml
/Idigital/Idgeneral/controllers/Checkout/CartController.php
/Idigital/Idgeneral/controllers/CartController.php
继承我的config.xml:
<?xml version="1.0"?>
<config>
<modules>
<idigital_idgeneral>
<version>0.1.0</version>
</idigital_idgeneral>
</modules>
<global>
<blocks>
<idgeneral><class>Idigital_Idgeneral_Block</class></idgeneral>
</blocks>
</global>
<frontend>
<routers>
<checkout>
<use>standard</use>
<args>
<modules>
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
</modules>
</args>
</checkout>
</routers>
<layout>
<updates>
<idgeneral>
<file>idigital.xml</file>
</idgeneral>
</updates>
</layout>
</frontend>
</config>
我已将控制器文件放在2个位置进行测试。 而且这是我的第一个控制器文件的顶部:
require_once 'Mage/Checkout/controllers/CartController.php';
class Idigital_Idgeneral_Checkout_CartController extends Mage_Checkout_CartController
{
public function testAction()
{
var_dump('inside checkout/cart/test');exit;
}
/**
* Add product to shopping cart action
*/
public function addAction()
{
blah...
}
Ans我的第二个控制器:
require_once 'Mage/Checkout/controllers/CartController.php';
class Idigital_Idgeneral_CartController extends Mage_Checkout_CartController
{
public function testAction()
{
var_dump('inside cart/test');exit;
}
/**
* Add product to shopping cart action
*/
public function addAction()
{
blah...
}
当我访问:/ checkout / cart / add 我指向法师控制器...而不是我的本地人。 (我在每个都有var_dump stmts。所以我可以看到哪个被运行了。)
当我访问/结帐/购物车/测试时 - 我得到404 当我访问/购物车/添加或购物车/测试时 - 我得到404 当我访问idgeneral / cart / test或idgeneral / cart / add时 - 我得到404
答案 0 :(得分:7)
创建模块文件夹和文件
app/code/local/MyNameSpace/MyModule/etc/config.xml
app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
app/etc/modules/MyNameSpace_All.xml
使用以下内容编辑/etc/config.xml并创建app / code / local / MyNameSpace / MyModule / etc / config.xml:
<?xml version="1.0"?>
<config>
<modules>
<MyNameSpace_MyModule>
<version>0.1.0</version>
</MyNameSpace_MyModule>
</modules>
<global>
<!-- This rewrite rule could be added to the database instead -->
<rewrite>
<!-- This is an identifier for your rewrite that should be unique -->
<!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER -->
<mynamespace_mymodule_checkout_cart>
<from><![CDATA[#^/checkout/cart/#]]></from>
<!--
- mymodule matches the router frontname below
- checkout_cart matches the path to your controller
Considering the router below, "/mymodule/checkout_cart/" will be
"translated" to "/MyNameSpace/MyModule/controllers/Checkout/CartController.php" (?)
-->
<to>/mymodule/checkout_cart/</to>
</mynamespace_mymodule_checkout_cart>
</rewrite>
</global>
<!--
If you want to overload an admin controller this tag should be <admin> instead,
or <adminhtml> if youre overloading such stuff (?)
-->
<frontend>
<routers>
<mynamespace_mymodule>
<!-- should be set to "admin" when overloading admin stuff (?) -->
<use>standard</use>
<args>
<module>MyNameSpace_MyModule</module>
<!-- This is used when "catching" the rewrite above -->
<frontName>mymodule</frontName>
</args>
</mynamespace_mymodule>
</routers>
</frontend>
注意:当我覆盖目录/产品控制器时,上面的内容对我不起作用。我不得不使用:
<from><![CDATA[#^catalog/product/#]]></from>
<to>mymodule/mycontroller</to>
(注意缺少的前导斜杠)
从Magento 1.3开始,您只需将模块添加到前端路由器即可。重写不再是必要的:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<MyNameSpace_MyModule>
<version>0.1.0</version>
</MyNameSpace_MyModule>
</modules>
<frontend>
<routers>
<checkout>
<args>
<modules>
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>
</modules>
</args>
</checkout>
</routers>
</frontend>
请注意,如果可用,before=”Mage_Checkout”
将首先加载您的控制器,如果没有,则会回退到Magento。
如果控制器在另一个文件夹中,则必须修改代码:
app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php.
<强>替换强>
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>
<强>与强>
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule>
修改'controllers/Checkout/CartController.php'
使用以下内容创建app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
:(对indexAction()的唯一更改是添加error_log()调用):
<?php
# Controllers are not autoloaded so we will have to do it manually:
require_once 'Mage/Checkout/controllers/CartController.php';
class MyNameSpace_MyModule_Checkout_CartController extends
Mage_Checkout_CartController
{
# Overloaded indexAction
public function indexAction() {
# Just to make sure
error_log('Yes, I did it!');
parent::indexAction();
}
}
修改'app/etc/modules/MyNameSpace_All.xml'
(这是为了激活你的模块)
真正 本地
编辑'app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml'
并添加以下内容以使用与以前相同的更新句柄:
<mynamespace_mymodule_checkout_cart_index>
<update handle="checkout_cart_index"/>
</mynamespace_mymodule_checkout_cart_index>
(请注意,这些标签似乎区分大小写。如果这对您不起作用,请尝试使用全部小写)
[Hendy:当我使用本Wiki或此处描述的方法覆盖目录/产品/视图时,我没有必要执行上述操作。但是,当使用'cms方式'时,我不得不手动更新句柄。]
以上项目对我不起作用(2009-02-19作者:Jonathan M Carvalho)
我发现要更改的文件是app / design / frontend / [myinterface] / [mytheme] /layout/mymodule.xml
添加以下行:
您需要使用重写正则表达式更精确,因为很难找到错误。
答案 1 :(得分:6)
<Idigital_Idgeneral before="Mage_Checkout">Idgeneral_Checkout</Idigital_Idgeneral>
应该是
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
或尝试将自定义控制器移至
../Idigital/Idgeneral/controllers/CartController.php
并使用
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral</Idigital_Idgeneral>
您的<modules>
代码位置也存在错误。它应该是:
<config>
<modules>
<idigital_idgeneral>
<version>0.1.0</version>
</idigital_idgeneral>
</modules>
<global>
...
</global>
<frontend>
....
</frontend>
...
</config>
即<modules>
不应在<global>
这是一个关于如何转储Magento看作XML的配置树的好教程:http://alanstorm.com/magento_config
答案 2 :(得分:3)
我离开这里是为了下一个可怜的开发商被迫与这个老爷车一起工作。这里的大部分说明都是从magento docs粘贴而来的,就像它的来源一样,是一个扭曲的误导迷宫。好的投诉......
这在版本1.8中适用于我
创建命名空间和模块: /应用程序/代码/本地/ myNameSpace对象/ MyModule的
创建模块配置: /app/code/local/MyNameSpace/MyModule/etc/config.xml
<?xml version="1.0" ?>
<config>
<modules>
<MyNameSpace_MyModule>
<version>0.1.0</version>
</MyNameSpace_MyModule>
</modules>
<frontend>
<routers>
<checkout>
<args>
<modules>
<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule>
</modules>
</args>
</checkout>
</routers>
</frontend>
创建您的控制器: /app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
<?php
require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php';
class MyNameSpace_MyModule_Checkout_CartController extends Mage_Checkout_CartController
{
public function indexAction() {
// /var/log/debug.log should log the output
Mage::log('cart index override', null, 'debug.log');
// Call the parent class
parent::indexAction();
}
}
启用新模块: /app/etc/modules/MyNameSpace_All.xml
<?xml version="1.0" ?>
<config>
<modules>
<MyNameSpace_MyModule>
<active>true</active>
<codePool>local</codePool>
</MyNameSpace_MyModule>
</modules>
</config>
这就是所需要的。现在去庆祝吧,你刚刚擦了一下粪便! ;)
答案 3 :(得分:1)
这是关于控制器的包含路径的一点通知。
如果 Magento编译器模式已开启,则包括路径可能导致错误。
require_once 'Mage/Checkout/controllers/CartController.php';
而不是使用
require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php';
它会更安全。
答案 4 :(得分:0)
嗯......它WONT覆盖了结账推车控制器。
所以我在产品视图中使用了URL REWRITE ...来自此链接...靠近文章的底部。他们说这是一个正确的方法......
http://www.excellencemagentoblog.com/magento-add-product-to-cart-ajax
if(!url){
url = jQuery('#product_addtocart_form').attr('action');
}
url = url.replace("checkout/cart","idgeneral/cart");
这对我有用。让我开裂。基本上叫我的控制器......而不是结账控制器。
感谢ROSCIUS的帮助...赞赏。
我还必须更改我的配置....我的路由器部分现在看起来像这样:
<routers>
<!-- THIS PART REGISTERS OUR CONTROLLERS FOLDER FOR USE -->
<idgeneral>
<use>standard</use>
<args>
<module>Idigital_Idgeneral</module>
<frontName>idgeneral</frontName>
</args>
</idgeneral>
<!-- THIS PART WONT WORK TO OVERWRITE OUR MAGE CONTROLLER -->
<checkout>
<use>standard</use>
<args>
<modules>
<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
</modules>
</args>
</checkout>
</routers>