我想要从前端页面到adminhtml页面的链接。我已经使用Adminhtml helper方法尝试:如何从前端控制器生成管理链接?
Mage::helper('adminhtml')->getUrl('some/admin/path')
和Adminhtml URL模型的方法:
Mage::getModel('adminhtml/url')->getUrl('some/admin/path')
,但无济于事。我每次都会被踢到管理员控制面板。
我想要从前端页面到adminhtml页面的链接。我已经使用Adminhtml helper方法尝试:如何从前端控制器生成管理链接?
Mage::helper('adminhtml')->getUrl('some/admin/path')
和Adminhtml URL模型的方法:
Mage::getModel('adminhtml/url')->getUrl('some/admin/path')
,但无济于事。我每次都会被踢到管理员控制面板。
简答:您不能(除少数例外 - 请参阅此答案的底部),至少不是没有disabling admin URL keys - 存在安全风险。
Magento将会话“表单密钥”与admin URL路径一起生成其管理URL密钥。这个表单关键字只是一个随机的16个字符的字符串,持续时间只要会话持续。麻烦的是,Magento使用不同的会话cookie,因此前端和adminhtml区域使用不同的表单键。
因此,当您从前端生成管理URL时,Magento使用前端会话中的表单键。然后,当您点击该链接时,Magento会重新生成管理URL密钥,以便与链接中的密钥进行比较,只有这一次,它使用adminhtml表单密钥。由于表单密钥不匹配,哈希URL密钥不匹配,并且您的链接不起作用。 Magento此时的行为是将您踢回管理员仪表板(或管理员登录页面)。
最终,这似乎是Magento的一个基本限制。我不相信有任何解决方法(但如果有人能纠正我,我会很高兴)。
更新:展望一些Magento的adminhtml控制器,似乎某些控制器的动作从默认要求URL键除外:
任何控制器,从Mage_Adminhtml_Controller_Action
继承可以允许某些行动,不将它们添加到$_publicActions
阵列需要一个管理网址的关键。因此,对于你自己的模块,或者如果你覆盖了Magento的模块,如果你有一个indexAction
在你的管理控制,你想是公开的,你会做这样这样的:
public $_publicActions = array('index');
链接产品在前端生成的编辑页面在前端生成
$urlModel = Mage::getModel('core/url');
$url = $urlModel->getUrl('adminhtml/catalog_product/edit', array(
'_current' => false,
'id' => $product->getId()
));
您可以使用此示例。
Mage::helper("adminhtml")->getUrl("module_name/controller_name/action_name",
array("param1"=>1,"param2"=>2));
如果您启用了管理员URL密钥,这对大多数管理员URL不起作用,这是默认配置并且对安全性有好处。 – cameronhimself 2014-02-08 21:30:35
默认情况下,你不能,但因为这是magento,你可以随时定制它。
看看Redirection to Admin Customer Edit (with key) from a frontend controller
您可以创建一个管理控制器,它会像一个代理获得那么URL重定向键到您想要的路线而不禁用管理URL键。
您可以使用$_publicActions
禁用管理员网址的验证)。
见Mage_Adminhtml_Controller_Action
protected function _validateSecretKey()
{
if (is_array($this->_publicActions) && in_array($this->getRequest()->getActionName(), $this->_publicActions)) {
return true;
}
if (!($secretKey = $this->getRequest()->getParam(Mage_Adminhtml_Model_Url::SECRET_KEY_PARAM_NAME, null))
|| $secretKey != Mage::getSingleton('adminhtml/url')->getSecretKey()) {
return false;
}
return true;
}
您的代理控制器
class MagePal_ProxyCustomerRedirect_Adminhtml_RedirectController extends Mage_Adminhtml_Controller_Action
{
/**
* Array of actions which can be processed without secret key validation
*
* @var array
*/
protected $_publicActions = array('redirecttocustomer');
public function redirecttocustomerAction()
{
// get the customer id pass by your observer (url key)
Mage::app()->getResponse()->setRedirect(Mage::helper("adminhtml")->getUrl("adminhtml/customer/edit/", array("id"=>$customer_id)));
这只能如果您禁用管理员URL键。 – cameronhimself 2013-04-23 14:38:00
已经在1.6.2.0和1.7.0.2上进行了测试 - 也适用于密钥。 – 2013-04-23 15:49:04
啊,你说得对。对不起,我在做一个错误的假设。有趣的是,对我来说,这似乎只适用于产品编辑页面 - 我尝试链接的其他任何操作都会将我踢回仪表板。我仔细研究了一下,现在我已经更新了我的答案。 – cameronhimself 2013-04-23 16:18:43