gpt4 book ai didi

Magento 覆盖 Controller

转载 作者:行者123 更新时间:2023-12-04 13:17:11 27 4
gpt4 key购买 nike

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

谁能看到我在这里做错了什么:
(我编辑了这段代码......现在包括一些建议......)

这是我的文件夹结构(2个 Controller 位置作为测试):

/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>

我已将我的 Controller 文件放在 2 个位置进行测试。
这是我的第一个 Controller 文件的顶部:
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...
}

回答我的第二个 Controller :
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
我指向法师 Controller ……不是我的本地人。 (我每个都有 var_dump stmts ..所以我可以看到哪个运行了)。

当我访问/checkout/cart/test - 我得到一个 404
当我访问/cart/add 或 cart/test - 我得到一个 404
当我访问 idgeneral/cart/test 或 idgeneral/cart/add - 我得到 404

最佳答案

  • 创建模块文件夹和文件
    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>

    注意:当我覆盖目录/产品 Controller 时,上述内容对我不起作用。我不得不使用:
                <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”如果可用,将首先加载您的 Controller ,如果没有,则回退到 Magento。

    如果 Controller 在另一个文件夹中,则必须修改代码: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>

    (请注意,这些标签似乎区分大小写。如果这不适合您,请尝试使用全部小写)

    [by Hendy:当我使用本 Wiki 或此处描述的方法覆盖目录/产品/ View 时,我不必执行上述操作。但是,当使用“cms 方式”时,我必须手动更新句柄。]

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

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

    添加以下行:


  • 将浏览器指向/checkout/cart/
    在您的 PHP 错误日志中,您应该会找到“是的,我做到了!”。

  • 您需要对重写正则表达式更加精确,因为很难找到错误。

    关于Magento 覆盖 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349530/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com