Magento覆盖控制器

Sha*_*eep 6 overriding controller magento cart

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

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

继承我的文件夹结构(2个控制器位置作为测试):

/Idigital/Idgeneral/etc/config.xml
/Idigital/Idgeneral/controllers/Checkout/CartController.php
/Idigital/Idgeneral/controllers/CartController.php
Run Code Online (Sandbox Code Playgroud)

继承我的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>
Run Code Online (Sandbox Code Playgroud)

我已将控制器文件放在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...
}
Run Code Online (Sandbox Code Playgroud)

我的第二个控制器:

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...
}
Run Code Online (Sandbox Code Playgroud)

当我访问:/ checkout/cart/add我指向法师控制器...而不是我的本地.(我每个都有var_dump stmts.所以我可以看到哪个被运行).

当我访问/结帐/购物车/测试时 - 我得到404当我访问/购物车/添加或购物车/测试时 - 当我访问idgeneral/cart/test或idgeneral/cart/add时我得到404 - 我得到404

Xma*_*cal 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
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:当我覆盖目录/产品控制器时,上面的内容对我不起作用.我不得不使用:

                <from><![CDATA[#^catalog/product/#]]></from>
                <to>mymodule/mycontroller</to>
    
    Run Code Online (Sandbox Code Playgroud)

    (注意丢失的前导斜线)

    从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>
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,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>
Run Code Online (Sandbox Code Playgroud)
  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();
        }
         }
    
    Run Code Online (Sandbox Code Playgroud)
    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>
    
    Run Code Online (Sandbox Code Playgroud)

    (请注意,这些标记似乎区分大小写.如果这对您不起作用,请尝试使用全部小写)

    [Hendy:当我使用本Wiki或此处描述的方法覆盖目录/产品/视图时,我没有必要执行上述操作.但是,当使用'cms方式'时,我不得不手动更新句柄.

    以上项目对我不起作用(2009-02-19作者:Jonathan M Carvalho)

    我发现要更改的文件是app/design/frontend/[myinterface]/[mytheme] /layout/mymodule.xml

    添加以下行:


    1. 将浏览器指向/ checkout/cart /在PHP错误日志中,您应该找到"是的,我做到了!".

    您需要使用重写正则表达式更加精确,因为很难找到错误.


Ros*_*ius 6

<Idigital_Idgeneral before="Mage_Checkout">Idgeneral_Checkout</Idigital_Idgeneral>
Run Code Online (Sandbox Code Playgroud)

应该

<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral>
Run Code Online (Sandbox Code Playgroud)

或者尝试将自定义控制器移动到

../Idigital/Idgeneral/controllers/CartController.php
Run Code Online (Sandbox Code Playgroud)

并使用

<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral</Idigital_Idgeneral>
Run Code Online (Sandbox Code Playgroud)

您的<modules>代码位置也存在错误.它应该是:

<config>
    <modules>
        <idigital_idgeneral>
            <version>0.1.0</version>
        </idigital_idgeneral>
    </modules>
    <global>
    ...
    </global>   

    <frontend>
        ....
    </frontend>
...
</config>
Run Code Online (Sandbox Code Playgroud)

<modules>不应该在里面<global>

这是一个关于如何转储Magento看作XML的配置树的好教程:http://alanstorm.com/magento_config