当您使用system.xml config 安装新扩展时,这是Magento中显示的一个非常常见的错误:
当您转到System->Configuration->Extension
选项卡时,显示404错误。您需要注销并再次登录,然后就可以了。但是有什么办法可以避免这种情况?
当您使用system.xml config 安装新扩展时,这是Magento中显示的一个非常常见的错误:
当您转到System->Configuration->Extension
选项卡时,显示404错误。您需要注销并再次登录,然后就可以了。但是有什么办法可以避免这种情况?
Answers:
正如@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(无需注销和登录),然后重定向回上一页:
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();
}
}
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>
以及带有链接的模板:
<a href="<?php echo $this->getUrl('adminhtml/permissions_aclReload/index'); ?>">
<?php echo $this->__('Reload ACL'); ?>
</a>
我把它放到Github上的一个小扩展中:SSE_AclReload(还将链接添加到“ 系统”>“权限”菜单中)
您还可以尝试在调度admin / noroute操作后立即自动重新加载ACL,但我更喜欢1)了解正在发生的事情,以及2)可以选择。
如果您在安装新的扩展程序并出现404错误页面时遇到任何问题,则只需进入System > Permissions > Roles
。刚刚保存的作用和不要忘了清除var/cache
,并var/seesion
和你的问题已经解决。