我想从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
文件如下所示: MyOne_MyExtension.xml:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<MyOne_MyExtension>
<active>true</active>
<codePool>local</codePool>
</MyOne_MyExtension>
</modules>
</config>
代码/本地/ 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>
和最后一个, code / 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 ...
}
}
?>
我用谷歌搜索了那么多,我没有看到错误...
任何帮助真的很棒!!!
问候, 的Matthias
答案 0 :(得分:5)
NB:鉴于目标方法......
Mage_Adminhtml_Catalog_ProductController->_initProductSave()
...最佳做法是排除使用消耗catalog_product_save_before
事件的adminhtml范围的观察者。
“首先,我尝试将文件复制到app / code / local文件夹中,在正确的结构中......”
这不是一种罕见的开发人员方法,但它永远不会奏效。 Magento操作控制器类不由自动加载器加载。它们由其真实文件系统路径显式加载。因此,所谓的“包含路径黑客”并不适用。
参考。 Mage_Core_Controller_Varien_Router_Standard->getControllerFileName()
您的第二种方法 - 使用适当的自定义扩展程序执行重写 - 是正确的方法。您所需要的只是了解Magento如何找到动作控制器目录并将动作控制器类与请求URL匹配。
在其config.xml中,Mage_Adminhtml
模块配置管理员路由器,该路由器负责匹配所有与管理员相关的请求:
<admin>
<routers>
<adminhtml>
<use>admin</use>
<args>
<module>Mage_Adminhtml</module>
<frontName>admin</frontName>
</args>
</adminhtml>
</routers>
</admin>
前面的配置代码片段做了两件事:<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>
可以看出,上面的配置只是在编译配置XML时添加或添加到admin/routers/adminhtml/args/
节点。如何解释和使用它来进行请求匹配非常类似于控制器匹配的“正常”过程。在上面的示例中,MyOne_MyExtension
模块实际上是将目录添加到Adminhtml模块的目录列表中。假设它位于local
codePool中,上面的示例指向目录
/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/
如果在
有一个动作控制器类,这将有效/[basepath]/app/code/local/MyOne/MyExtension/controllers/Catalog/ProductController/Catalog/ProductController.php
在名为
的类中包含_initProductSave()
方法
MyOne_MyExtension_Catalog_ProductController_Catalog_ProductController
希望这种解释足以看出基于配置的控制器在目录级别重写工作,而不是通过指定特定的类(这是块,帮助器和模型重写的工作方式)。因为此配置添加了一个目录,所以它不必导致重写,因为它可以用于简单地为给定模块添加新操作。最终,仅当某些其他控制器类在“原始”控制器类之前匹配时,才会发生动作控制器重写。
答案 1 :(得分:4)
由于Magento只需知道模块名称即可找到匹配控制器的路径,
变化:
<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
为:
<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension</MyOne_MyExtension>