如何为补丁SUPEE-6788更新自定义模块的管理路由器


34

我不确定如何更新自定义模块以与SUPEE-6788补丁一起使用,说明不是很清楚。

基于Alan Storm的教程,我在生成器www.silksoftware.com/magento-module-creator/中创建了一个简单模块进行测试。它在admin中具有自定义页面,可以很好地工作,但是当我应用SUPEE-6788中要求的修复程序时,管理页面将显示404错误。

自定义管理页面的URL为:

本地主机/index.php/admin/ admin_adminhello / adminhtml_adminhello后端 / index / key / 83f08ec4bddff37e47412e16acc8d3f6 /

这是模块的配置:

<config>
    <modules>
        <Pulsestorm_Adminhello>
            <version>0.1.0</version>
        </Pulsestorm_Adminhello>
    </modules>
    <global>
        <helpers>
            <adminhello>
                <class>Pulsestorm_Adminhello_Helper</class>
            </adminhello>
        </helpers>
        <blocks>
            <adminhello>
                <class>Pulsestorm_Adminhello_Block</class>
            </adminhello>
        </blocks>
    </global>
    <admin>
        <routers>
            <adminhello>
                <use>admin</use>
                <args>
                    <module>Pulsestorm_Adminhello</module>
                    <frontName>admin_adminhello</frontName>
                </args>
            </adminhello>
        </routers>
    </admin>
    ...

这是控制器:

/app/code/local/Pulsestorm/Adminhello/controllers/Adminhtml/AdminhellobackendController.php

class Pulsestorm_Adminhello_Adminhtml_AdminhellobackendController extends Mage_Adminhtml_Controller_Action
{
    public function indexAction()
    {
        $this->loadLayout();
        $this->_title($this->__("My Test Page Title"));
        $this->renderLayout();
    }
}

<routers>根据修补程序中的说明更换了零件,可能是这样(可能不正确):

<routers>
    <adminhtml>
        <args>
            <modules>
                <admin_adminhello after="Mage_Adminhtml">Pulsestorm_Adminhello_Adminhtml</admin_adminhello>
            </modules>
        </args>
    </adminhtml>
</routers>

但是现在,URL仅显示404 error

本地主机/index.php/admin/admin_adminhello/adminhtml_adminhellobackend/index/key/83f08ec4bddff37e47412e16acc8d3f6/

如何为该新补丁正确修复模块?config.xml应用此补丁后,我是否只需要更新或还需要更改管理页面的URL?

Answers:


42

我设法更改了我的自定义模块,以使用补丁6788推荐的Magento新方法。因此,我在这里提供了其他参考,同时也在此线程中回答了问题。

  1. 在config.xml文件中更改为router:

之前:

<admin>
    <routers>
        <adminhello>
            <use>admin</use>
            <args>
                <module>Pulsestorm_Adminhello</module>
                <frontName>admin_adminhello</frontName>
            </args>
        </adminhello>
    </routers>
</admin>

<admin>
    <routers>
        <adminhtml>
            <args>
                <modules>
                    <adminhello before="Mage_Adminhtml">Pulsestorm_Adminhello_Adminhtml</adminhello>
                </modules>
            </args>
        </adminhtml>
    </routers>
</admin>
  1. 更改为控制器

2.1。

路径之前

/app/code/local/Pulsestorm/Adminhello/controllers/Adminhtml/AdminhellobackendController.php

后路径

/app/code/local/Pulsestorm/Adminhello/controllers/Adminhtml/Adminhello/AdminhellobackendController.php

2.2

课前

class Pulsestorm_Adminhello_Adminhtml_AdminhellobackendController extends Mage_Adminhtml_Controller_Action 
{
..
}

下课以后

class Pulsestorm_Adminhello_Adminhtml_Adminhello_AdminhellobackendController extends Mage_Adminhtml_Controller_Action
{
...
}
  1. 如果您有一个adminhtml.xml文件(仅作为示例,如下所示)

之前

<config>
    <menu>
        <adminhello_config translate="title" module="adminhello">
            <title>Adminhello Settings</title>
            <sort_order>100</sort_order>
            <children>
                <list_action translate="title" module="adminhello">
                    <title>Manage Hellos</title>
                    <sort_order>4</sort_order>
                <action>adminhello/adminhtml_adminhellobackend</action>
                </list_action>
...
            </children>
        </adminhello_config>
    </menu>
</config>

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <menu>
        <adminhello_config translate="title" module="adminhello">
            <title>Adminhello Settings</title>
            <sort_order>100</sort_order>
            <children>
                <list_action translate="title" module="adminhello">
                    <title>Manage Hellos</title>
                    <sort_order>4</sort_order>
                <action>adminhtml/adminhello_adminhellobackend</action>
                </list_action>
...
            </children>
        </adminhello_config>
    </menu>
</config>
  1. 更改密码

之前:获取URL

Mage::getUrl('adminhello/adminhtml_adminhellobackend/doSomething')

之后:获取URL

Mage::getUrl('adminhtml/adminhello_adminhellobackend/doSomething')
  1. 更改布局文件(例如,如果有布局文件,如下所示)

布局前

<adminhello_adminhtml_adminhellobackend_index>
...
</adminhello_adminhtml_adminhellobackend_index>

布局后

<adminhtml_adminhello_adminhellobackend_index>
...
</adminhtml_adminhello_adminhellobackend_index>

优秀!像魅力一样工作!
BENN1TH

17

我花了几个小时才弄清楚这一点。仅仅因为Magento的开发人员无法进行易于理解的配置,甚至无法以人类能够阅读的方式记录其代码。

让我们来看看config.xml中第一

<routers>
<adminhtml>
    <args>
        <modules>
            <admin_adminhello after="Mage_Adminhtml">Pulsestorm_Adminhello_Adminhtml</admin_adminhello>
        </modules>
    </args>
</adminhtml>

标签的整体含义已更改。“模块”下的标签只是一个随机名称。您只需要确保其唯一性即可确保在编译XML时不会覆盖它。它对URL有影响。

<admin_adminhello after= ..... >

Magento现在期望您将后端控制器类移动到名为“ adminhtml”的新子文件夹中。这就是为什么在config.xml中必须通过添加_Adminhtml来更改类名后缀的原因

... >Pulsestorm_Adminhello_Adminhtml</admin_adminhello> ....

您的情况下,该文件夹位于

应用程序/代码/本地/ Pulsestorm / Adminhello / controllers / Adminhtml

现在是真正的问题。使用另一个(更好的)系统,您可以使用“ FrontName”标签定义自己的名称空间。您再也没有这种奢侈了,因此需要确保您的控制器具有唯一的名称。否则,它将与其他扩展冲突。因此,名为“ AdminController.php”之类的控制器不再适用,您必须使其针对特定项目,例如您的“ AdminhelloController.php

您的网址随后会更改为

http://localhost/index.php/admin/adminhellobackend/index/key/83f08ec4bddff37e47412e16acc8d3f6/

重命名或移动文件后,别忘了调整控制器的类名

/app/code/local/Pulsestorm/Adminhello/controllers/Adminhtml/AdminhellobackendController.php

在这种情况下,名称将为 Pulsestorm_Adminhello_Adminhtml_AdminhellobackendController

当然,您还必须调整在后端使用的菜单项表单中使用的所有URL

还要确保您在index.php中打开开发人员模式文件。我注意到,如果控制器中存在某些错误,您还会得到404。在Develeport模式下,您会得到Stacktrace错误。

我还要做的是,一旦调用控制器,就只写一个日志,以使您了解是否完全访问了控制器方法。

/app/code/local/Pulsestorm/Adminhello/controllers/Adminhtml/AdminhellobackendController.php

class Pulsestorm_Adminhello_Adminhtml_AdminhellobackendController extends Mage_Adminhtml_Controller_Action
{
    public function indexAction()
    {
        Mage::log('Controller was accessed', null, 'controller.log', true);
        $this->loadLayout();
        $this->_title($this->__("My Test Page Title"));
        $this->renderLayout();
    }
}

如果可行,您可以扩大答案吗?谢谢!
Claudiu Creanga 2015年

好的,完成了...希望对您
有所

嘿,曾经有一天在旧的MagentoCommerce论坛上引起了您对Magento开发人员的热烈欢迎,他们对您的“ 甚至还记录了他们的代码 ”的评论。“但是代码是自我记录的……”。Umm当时没有通过perl pod测试。感谢您的上述说明,我需要它。
Fiasco Labs 2015年

3
Magento现在希望您将后端控制器类移动到名为“ adminhtml”的新子文件夹中 -这不是真的,控制器可以位于您想要的任何位置,在这种情况下,它仅位于adminhtml文件夹下,因为您已定义了起始路径的Pulsestorm_Adminhello_Adminhtmlconfig.xml中。您还需要更新任何管理员布局句柄,并调用以生成admin URL getUrl()
乔纳森·侯赛

@leedch我想弄清楚为什么更改我的SUPEE-6788的管理路由时,此模块为何不起作用,无论我尝试什么,都遇到404错误。这是一个用于打印自定义html发票的简单模块。github.com/gaiterjones/magento-htmlinvoice
PAJ

8

这是一个针对Magento SUPEE-6788补丁导致的扩展和自定义冲突的分析/修复工具。

https://github.com/rhoerr/supee-6788-toolbox

注意: 在应用任何修补程序或修补程序修补程序之前,始终建议对网站和数据库进行备份。

您只能分析需要解决的问题。

要分析:从SSH运行:php -f fixSUPEE6788.php -- analyze

这将显示哪些文件有问题以及如何解决它们。这将不会应用此修复程序。

或者,您也可以应用更改/修复。

要应用更改:从SSH运行:php -f fixSUPEE6788.php -- fix

这将自动分析并应用此修复程序。


您的好分享+1
阿米特·贝拉

是否这样做,但所有此类模块的管理页面仍显示页面404
Wasiq Shahrukh,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.