gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:20:28 26 4
gpt4 key购买 nike

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

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

任何人都可以帮助我...... :)

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

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

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

版本 2:用扩展覆盖 Controller

我的扩展看起来像这样:

文件结构:

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>

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>

最后一个,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 ...
}
}
?>

我已经用谷歌搜索并阅读了很多,我没有看到任何错误......

任何帮助都会很棒!!!

您好,马蒂亚斯

最佳答案

注意:鉴于目标方法...

Mage_Adminhtml_Catalog_ProductController->_initProductSave()

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


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

这不是一种不常见的开发人员方法,但它永远不会奏效。 Magento Action Controller 类由自动加载器加载。它们由它们的真实文件系统路径显式加载。因此,所谓的“include path hack”并不适用。

引用。 Mage_Core_Controller_Varien_Router_Standard->getControllerFileName() .

您的第二种方法 - 使用适当的自定义扩展执行重写 - 是正确的方法。您只需要了解 Magento 如何查找 Action Controller 目录并将 Action Controller 类与请求 URL 匹配。

在其 config.xml 中,Mage_Adminhtml模块配置 Admin router,它负责匹配所有与 admin 相关的请求:

<admin>
<routers>
<adminhtml>
<use>admin</use>
<args>
<module>Mage_Adminhtml</module>
<frontName>admin</frontName>
</args>
</adminhtml>
</routers>
</admin>

前面的配置片段做了两件事:<frontName />节点添加模块路由,<module />节点 - 以及已注册的 Mage_Adminhtml <codePool /> value ("core") - 建立一个可以在其中找到 Action Controller 类的目录,在本例中为 /[basepath]/app/code/core/Mage/Adminhtml/controllers/ .

模块 Action Controller 通过将其他候选匹配目录添加到现有模块路由来重写工作。这都是从配置中解析出来的:

<admin>
<routers>
<adminhtml>
<args>
<modules>
<MyOne_MyExtension before="Mage_Adminhtml">MyOne_MyExtension_Catalog_ProductController</MyOne_MyExtension>
</modules>
</args>
</adminhtml>
</routers>
</admin>

可以看出,上面的配置只是对admin/routers/adminhtml/args/进行了简单的添加或添加编译配置 XML 时的节点。这是如何解释和用于请求匹配的,与 Controller 匹配的“正常”过程非常相似。在上面的示例中,MyOne_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

其中包含一个 _initProductSave()名为

的类中的方法
MyOne_MyExtension_Catalog_ProductController_Catalog_ProductController

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

关于Magento:重载 Adminhtml/Productcontroller 的 saveAction 方法将不起作用……?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11281543/

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