Magento:重载Adminhtml/Productcontroller的saveAction方法不起作用......?

use*_*965 2 controller product overwrite magento adminhtml

我想从core/Mage/Adminhtml/controllers/Catalog/ProductController.php重载saveAction方法,它不起作用 - 我现在已经搜索并尝试了一整天:(

背景:我想在保存产品之前更改自定义属性的值.我发现,_initProductSave设置属性,我认为,在init_ProductSave之后更改它们将是一个好点(如果有人知道更好的地方,请告诉我)...

愿任何人请帮助我... :)

Magento版本: Community Edition版本1.7.0.1没有扩展,没有安装主题,我刚安装这个版本完全空白...

版本1:通过复制到本地/ Mage文件夹覆盖控制器

首先,我尝试将文件复制到app/code/local文件夹中,在正确的结构中 - 但它不起作用(我已经使用Varient.php进行本地测试系统和stores.php来纠正价格错误 - 因为它的工作......)

版本2:用扩展名覆盖控制器

我的扩展程序如下所示:

文件结构:

code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php 
code/local/MyOne/MyExtension/etc/config.xml 
etc/modules/MyOne_MyExtension.xml
Run Code Online (Sandbox Code Playgroud)

这些文件如下所示:MyOne_MyExtension.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <active>true</active>
            <codePool>local</codePool>
        </MyOne_MyExtension>
    </modules>
</config>
Run Code Online (Sandbox Code Playgroud)

代码/本地/ MyOne/MyExtension的/ etc/config.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <version>1.0.0</version>
        </MyOne_MyExtension>
    </modules>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>
Run Code Online (Sandbox Code Playgroud)

最后一个,代码/ local/MyOne/MyExtension/controllers/Catalog/ProductController.php:

<?php
require_once 'Mage/Adminhtml/controllers/Catalog/ProductController.php';

class MyOne_MyExtension_Catalog_ProductController extends Mage_Adminhtml_Catalog_ProductController
{
    public function saveAction()
    {
        // do my stuff
        die('reached method');
        // after pressing on save, there should no be a white screen ...
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了那么多,我没有看到错误......

任何帮助真的会很棒!!!

问候,马提亚

ben*_*rks 6

注意:鉴于该方法有针对性......

Mage_Adminhtml_Catalog_ProductController->_initProductSave()
Run Code Online (Sandbox Code Playgroud)

...最佳做法是排除使用消耗该catalog_product_save_before事件的adminhtml范围的观察者.


"首先,我尝试将文件复制到app/code/local文件夹中,在正确的结构中..."

这不是一种不常见的开发人员方法,但它永远不会起作用.自动装带器加载Magento动作控制器类.它们由真实的文件系统路径显式加载.因此,所谓的"包含路径黑客"不适用.

参考.Mage_Core_Controller_Varien_Router_Standard->getControllerFileName().

您的第二种方法 - 使用适当的自定义扩展程序执行重写 - 是正确的方法.您只需要了解Magento如何找到动作控制器目录并将动作控制器类与请求URL匹配.

在其config.xml中,Mage_Adminhtml模块配置Admin路由器,该路由器负责匹配所有与管理员相关的请求:

<admin>
    <routers>
        <adminhtml>
            <use>admin</use>
            <args>
                <module>Mage_Adminhtml</module>
                <frontName>admin</frontName>
            </args>
        </adminhtml>
    </routers>
</admin>
Run Code Online (Sandbox Code Playgroud)

前面的配置代码片段做了两件事:<frontName />节点添加模块路由,<module />节点 - 以及注册Mage_Adminhtml <codePool />值("核心") - 建立一个目录,在这个目录中可以找到动作控制器类,在本例中/[basepath]/app/code/core/Mage/Adminhtml/controllers/.

模块操作控制器通过将其他候选匹配目录添加到现有模块路由来重写工作.这一切都是从配置中解析出来的:

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>
Run Code Online (Sandbox Code Playgroud)

可以看出,上述配置只是admin/routers/adminhtml/args/在编译配置XML时添加或添加到节点.如何解释和使用它来进行请求匹配非常类似于控制器匹配的"正常"过程.在上面的示例中,MyOne_MyExtension模块有效地将目录添加到Adminhtml模块的目录列表中.假设它在localcodePool中,上面的例子指向目录

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/
Run Code Online (Sandbox Code Playgroud)

如果有一个动作控制器类,这将工作

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/Catalog/ProductController.php
Run Code Online (Sandbox Code Playgroud)

其中包含一个_initProductSave()名为的类中的方法

MyOne_MyExtension_Catalog_ProductController_Catalog_ProductController
Run Code Online (Sandbox Code Playgroud)

希望这种解释足以看出基于配置的控制器在目录级别重写工作,而不是通过指定特定的类(这是块,帮助器和模型重写的工作方式).因为此配置添加了一个目录,所以它不必导致重写,因为它可以用于简单地为给定模块添加新操作.最终,仅当某些其他控制器类在"原始"控制器类之前匹配时,才会发生动作控制器重写.