Magento覆盖控制器

时间:2012-07-05 17:34:09

标签: magento controller override cart

我想做上述事情。 我已经覆盖了过去的许多文件......块,模型,助手......但是这个文件让我望而却步。

任何人都可以在这里看到我做错了什么: (香港专业教育学院编辑了这段代码......现在包括一些建议......)

继承我的文件夹结构(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

5 个答案:

答案 0 :(得分:7)

  1. 创建模块文件夹和文件

    app/code/local/MyNameSpace/MyModule/etc/config.xml
    app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
    app/etc/modules/MyNameSpace_All.xml
    
  2. 使用以下内容编辑/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.

  3. <强>替换

    <MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>

    <强>与

        <MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule>
    
    1. 修改'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();
          }
           }
      
      1. 修改'app/etc/modules/MyNameSpace_All.xml' (这是为了激活你的模块)

                              真正         本地     

    2. 编辑'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. 将浏览器指向/ checkout / cart / 在PHP错误日志中,您应该找到“是的,我做到了!”。
      2. 您需要使用重写正则表达式更精确,因为很难找到错误。

答案 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>