如何避免新扩展安装上的404错误


27

当您使用system.xml config 安装新扩展时,这是Magento中显示的一个非常常见的错误:

当您转到System->Configuration->Extension选项卡时,显示404错误。您需要注销并再次登录,然后就可以了。但是有什么办法可以避免这种情况?


我不这么认为,当您登录并存储在用户会话中时,会加载ACL树。
彼得·奥卡拉汉

我有一个主意,但我不知道是否可能。您可以更改“ Magento Connect管理”的行为,以在安装扩展名后使所有管理会话期满。但是从扩展范围((((。仅从Connect Manager的范围
。– oleksii.svarychevskyi

2
您的问题回答了我的问题!谢谢!
伊恩·菲利普斯

我不得不发表评论,因为正如伊恩所说:“您的问题回答了我的问题”。记录成功了!
汉斯·瓦辛克

Answers:


16

正如@Cags所说,这是(轻松)不可能的,因为初始化会话时会加载ACL树(管理员登录时又称为AKA)。
可能的解决_isSectionAllowed方法是在系统配置控制器(Mage_Adminhtml_System_ConfigController::_isSectionAllowed)中覆盖该方法,并使其重新加载ACL树。
就像是:

protected function _isSectionAllowed($section)
{
    $session = Mage::getSingleton('admin/session');
    $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());//reload the tree
    return parent::_isSectionAllowed($secntion); //all the code from the original method
}

但这意味着每次您访问config节时都会重新加载ACL树。我认为这样做毫无意义。
同样,您不能为一个特定的扩展名执行此操作。您将不得不重写核心类。


如果不允许该部分,最好只重置ACL树。老实说,我无法回忆起尝试加载ACL不允许的部分,除了在模块安装之后和管理员重新记录之前。
pspahn 2014年

只是一个疯狂的主意,因为我从没有尝试过,而且现在不确定该会话是否可用,但是可以从安装脚本中重新加载吗?当然,这仅在安装脚本由您以管理员身份登录的请求触发且不会影响其他已登录后端用户的情况下才有效
Fabian Schmengler 2014年

2
@fschmengler。我以前没有尝试过,但是我认为它可以工作。老实说,邦特,我认为这不值得麻烦。
马吕斯

9

我找到了一种解决方法,几乎​​不需要定制。我们需要的是:

  1. 一个新的控制器操作将重新加载ACL(无需注销和登录),然后重定向回上一页:

    class SSE_AclReload_Adminhtml_Permissions_AclReloadController extends Mage_Adminhtml_Controller_Action
    {
        public function indexAction()
        {
            $session = Mage::getSingleton('admin/session');
            $session->setAcl(Mage::getResourceModel('admin/acl')->loadAcl());
            Mage::getSingleton('adminhtml/session')->addSuccess($this->__('ACL reloaded'));
            $this->_redirectReferer();
        }
    }
  2. admin_noroute手柄的布局更新。我们将直接在admin 404页面上添加指向此新控制器操作的链接:

    <layout version="0.1.0">
        <adminhtml_noroute>
            <reference name="content">
                <block type="adminhtml/template" name="content.aclReload" after="content.noRoute" template="sse_aclreload/button.phtml" />
            </reference>
        </adminhtml_noroute>
    </layout>
  3. 以及带有链接的模板:

    <a href="<?php echo $this->getUrl('adminhtml/permissions_aclReload/index'); ?>">
        <?php echo $this->__('Reload ACL'); ?>
    </a>

我把它放到Github上的一个小扩展中:SSE_AclReload(还将链接添加到“ 系统”>“权限”菜单中)

您还可以尝试在调度admin / noroute操作后立即自动重新加载ACL,但我更喜欢1)了解正在发生的事情,以及2)可以选择。


1

如果您在安装新的扩展程序并出现404错误页面时遇到任何问题,则只需进入System > Permissions > Roles。刚刚保存的作用和不要忘了清除var/cache,并var/seesion 和你的问题已经解决。


“清除var /会话”?要注销所有客户并清空他们的购物车?不。
Fabian Schmengler

nup,只需清除会话即可,位于var文件夹中
Hiral Unadkat

不幸的是,这是相同的。除非您不使用文件会话处理程序。在这种情况下,它什么也不做,因为没有文件
Fabian Schmengler

然后您需要做的是进入系统>权限>角色并保存角色。
Hiral Unadkat

这给我们带来了您的答案的另一个问题:即使可行,但要注销和重新登录要付出更多的努力,OP希望避免这种情况。
Fabian Schmengler,

0

尝试这个:

  1. 转到管理->系统->缓存管理
  2. 选择所有缓存类型
  3. 保持动作为“刷新”并点击“提交”。
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.