Magento:重载Adminhtml/Productcontroller’;s saveAction方法赢得’;t工作…;?

Magento:重载Adminhtml/Productcontroller’;s saveAction方法赢得’;t工作…;?,magento,controller,product,overwrite,adminhtml,Magento,Controller,Product,Overwrite,Adminhtml,我想从core/Mage/Adminhtml/controllers/Catalog/ProductController.php中重载saveAction方法,但它不起作用-我现在已经搜索并尝试了一整天:( 背景:我想在保存产品之前更改自定义属性的值。我发现,\u initProductSave设置了属性,我认为,在init\u ProductSave之后更改它们将是一个好主意(如果有人知道更好的地方,请告诉我) 谁能帮帮我……:) Magento版本:Community Edition 1.7

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

背景:我想在保存产品之前更改自定义属性的值。我发现,\u initProductSave设置了属性,我认为,在init\u ProductSave之后更改它们将是一个好主意(如果有人知道更好的地方,请告诉我)

谁能帮帮我……:)

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

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

首先,我尝试将文件复制到app/code/local文件夹中,在正确的结构中,但它不起作用(我用variant.php实现了本地测试系统,用stores.php纠正了价格错误,这两种方法都起作用了…)

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

我的扩展如下所示:

文件结构:

code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php 
code/local/MyOne/MyExtension/etc/config.xml 
etc/modules/MyOne_MyExtension.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <active>true</active>
            <codePool>local</codePool>
        </MyOne_MyExtension>
    </modules>
</config>
<?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 ...
    }
}
?>
文件的外观如下所示: MyOne_MyExtension.xml:

code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php 
code/local/MyOne/MyExtension/etc/config.xml 
etc/modules/MyOne_MyExtension.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <active>true</active>
            <codePool>local</codePool>
        </MyOne_MyExtension>
    </modules>
</config>
<?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 ...
    }
}
?>

真的
地方的
code/local/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>

1.0.0
MyOne\u MyExtension\u目录\u产品控制器
最后一个,code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php:

code/local/MyOne/MyExtension/controllers/Catalog/ProductController.php 
code/local/MyOne/MyExtension/etc/config.xml 
etc/modules/MyOne_MyExtension.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyOne_MyExtension>
            <active>true</active>
            <codePool>local</codePool>
        </MyOne_MyExtension>
    </modules>
</config>
<?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 ...
    }
}
?>

我已经在谷歌上搜索并阅读了那么多,我没有看到任何错误

任何帮助都会很好

您好,
matthias

因为Magento只需要知道模块名称即可找到匹配控制器的路径

更改:

<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
MyOne\u MyExtension\u Catalog\u ProductController
致:

MyOne\u MyExtension

NB:给定目标方法

Mage_Adminhtml_Catalog_ProductController->_initProductSave()
…最好的做法是在事件之前排除使用adminhtml范围的观察者来消费
catalog\u product\u save\u


“首先,我试图将该文件复制到app/code/local文件夹中,在正确的结构中…”

这不是一种少见的开发人员方法,但它永远不会起作用Magento操作控制器类不是由自动加载程序加载的。它们是由实际文件系统路径显式加载的。因此,所谓的“包含路径黑客”不适用

参考

第二种方法是使用适当的自定义扩展执行重写,这是正确的方法。您只需了解Magento如何查找操作控制器目录并将操作控制器类与请求URL相匹配

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

<admin>
    <routers>
        <adminhtml>
            <use>admin</use>
            <args>
                <module>Mage_Adminhtml</module>
                <frontName>admin</frontName>
            </args>
        </adminhtml>
    </routers>
</admin>
可以看出,在编译配置XML时,上面的配置只是添加或添加到
admin/routers/adminhtml/args/
节点。如何解释并用于请求匹配与控制器匹配的“正常”过程非常相似。在上面的示例中,
MyOne\u MyExtension
模块有效地将目录添加到Adminhtml模块的目录列表中。假设它位于
local
codePool中,上面的示例指向该目录

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/
如果在上有一个action controller类,这将起作用

/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/Catalog/ProductController.php
它在名为的类中包含一个
\u initProductSave()
方法

MyOne_MyExtension_Catalog_ProductController_Catalog_ProductController

希望这个解释足以说明基于配置的控制器重写在目录级别工作,而不是通过指定特定的类(这就是块、助手和模型重写的工作方式)。因为这个配置添加了一个目录,所以它不必导致重写,因为它可以用于简单地为给定模块添加新操作。最终,只有在“原始”控制器类之前的其他控制器类匹配时,才会发生动作控制器重写。

已测试-此解决方案有效。。。关于我做错了什么的完整解释如下。非常感谢你的帮助!在这种情况下,代码是正确的,但解释是不正确的。这是正确的,根据代码,它是有效的,根据解释,您的答案是正确的:)[对不起,丹尼尔;)]这也是正确的…:)谢谢!!!(救了我一天;)@benmarks:丹尼尔的解决方案也是你非常好的解释的结果,对吧?当然我读到了《观察家》的最佳实践,我明天也会测试一下:)