Magento 如何从前端控制器生成管理链接?
我想有一个从前端页面到adminhtml页面的链接。我已尝试使用Adminhtml助手方法:Magento 如何从前端控制器生成管理链接?,magento,Magento,我想有一个从前端页面到adminhtml页面的链接。我已尝试使用Adminhtml助手方法: Mage::helper('adminhtml')->getUrl('some/admin/path') 以及Adminhtml URL模型方法: Mage::getModel('adminhtml/url')->getUrl('some/admin/path') 但是没有用。每次我都会被踢到管理仪表板上。简短回答:你不能(除了少数例外——请参见本答案的底部),至少不能没有——安全风险
Mage::helper('adminhtml')->getUrl('some/admin/path')
以及Adminhtml URL模型方法:
Mage::getModel('adminhtml/url')->getUrl('some/admin/path')
但是没有用。每次我都会被踢到管理仪表板上。简短回答:你不能(除了少数例外——请参见本答案的底部),至少不能没有——安全风险
Magento散列会话“表单键”以及管理员URL路径,以生成其管理员URL键。这个表单键只是一个随机的16个字符的字符串,它的持续时间与会话的持续时间一样长。问题在于Magento对前端和adminhtml区域使用了不同的会话cookie,因此使用了不同的表单键
因此,当您从前端生成管理员URL时,Magento使用前端会话中的表单键。然后,当您单击该链接时,Magento会重新生成管理员URL键以与链接中的键进行比较,只是这次它使用了adminhtml表单键。由于表单键不匹配,哈希URL键不匹配,链接将无法工作。此时,Magento的行为是将您踢回管理仪表板(或管理员登录页面)
最终,这似乎是Magento的一个基本限制。我不相信有任何解决办法(但如果有人能纠正我,我会很高兴)
更新:查看一些Magento的adminhtml控制器,似乎某些控制器操作在默认情况下不需要URL键:
- 管理员HTML/目录\产品/编辑
- 管理员HTML/目录\产品\审查/编辑
- 管理员HTML/销售订单/查看
- 管理员HTML/销售订单/索引
- 所有Oauth操作
Mage\u Adminhtml\u controller\u Action
继承的任何控制器都可以通过将某些操作添加到$\u publicActions
数组中来允许它们不需要管理员URL键。因此,对于您自己的模块,或者如果您要覆盖Magento模块,如果您的管理控制器中有一个索引
,您希望公开,您可以这样做:
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));
默认情况下,您不能,但由于这是magento,您始终可以自定义它 看看 您可以创建一个管理员控制器,它可以像代理一样获取url密钥,然后重定向到您想要的路由,而无需禁用管理员url密钥 您可以使用
$\u publicActions
)禁用管理员url的验证
请参阅Mage\u Adminhtml\u Controller\u 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)));
已经在1.6.2.0和1.7.0.2上测试过-也可以使用密钥。啊,你说得对。对不起,我做了一个错误的假设。有趣的是,对我来说,这似乎只适用于产品编辑页面——我试图链接的每一个动作都会将我踢回仪表板。我仔细研究了一下,现在更新了我的答案。如果启用了管理员URL密钥,这将不适用于大多数管理员URL,这是默认配置,并且有利于安全性。