Magento:重载Adminhtml/Productcontroller’;s saveAction方法赢得’;t工作…;?
我想从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:用扩展覆盖控制器 我的扩展如下所示: 文件结构: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
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:丹尼尔的解决方案也是你非常好的解释的结果,对吧?当然我读到了《观察家》的最佳实践,我明天也会测试一下:)