2013-04-22 91 views
1

我想要从前端页面到adminhtml页面的链接。我已经使用Adminhtml helper方法尝试:如何从前端控制器生成管理链接?

Mage::helper('adminhtml')->getUrl('some/admin/path') 

和Adminhtml URL模型的方法:

Mage::getModel('adminhtml/url')->getUrl('some/admin/path') 

,但无济于事。我每次都会被踢到管理员控制面板。

回答

5

简答:您不能(除少数例外 - 请参阅此答案的底部),至少不是没有disabling admin URL keys - 存在安全风险。

Magento将会话“表单密钥”与admin URL路径一起生成其管理URL密钥。这个表单关键字只是一个随机的16个字符的字符串,持续时间只要会话持续。麻烦的是,Magento使用不同的会话cookie,因此前端和adminhtml区域使用不同的表单键。

因此,当您从前端生成管理URL时,Magento使用前端会话中的表单键。然后,当您点击该链接时,Magento会重新生成管理URL密钥,以便与链接中的密钥进行比较,只有这一次,它使用adminhtml表单密钥。由于表单密钥不匹配,哈希URL密钥不匹配,并且您的链接不起作用。 Magento此时的行为是将您踢回管理员仪表板(或管理员登录页面)。

最终,这似乎是Magento的一个基本限制。我不相信有任何解决方法(但如果有人能纠正我,我会很高兴)。


更新:展望一些Magento的adminhtml控制器,似乎某些控制器的动作从默认要求URL键除外:

  • adminhtml/catalog_product /编辑
  • adminhtml/catalog_product_review /编辑
  • adminhtml/sales_order/view
  • adminhtml/sales_order/index
  • 所有的Oauth操作。

任何控制器,从Mage_Adminhtml_Controller_Action继承可以允许某些行动,不将它们添加到$_publicActions阵列需要一个管理网址的关键。因此,对于你自己的模块,或者如果你覆盖了Magento的模块,如果你有一个indexAction在你的管理控制,你想是公开的,你会做这样这样的:

public $_publicActions = array('index'); 
1

链接产品在前端生成的编辑页面在前端生成

  $urlModel = Mage::getModel('core/url'); 
      $url = $urlModel->getUrl('adminhtml/catalog_product/edit', array(
       '_current' => false, 
       'id' => $product->getId() 
      )); 
+0

这只能如果您禁用管理员URL键。 – cameronhimself 2013-04-23 14:38:00

+0

已经在1.6.2.0和1.7.0.2上进行了测试 - 也适用于密钥。 – 2013-04-23 15:49:04

+0

啊,你说得对。对不起,我在做一个错误的假设。有趣的是,对我来说,这似乎只适用于产品编辑页面 - 我尝试链接的其他任何操作都会将我踢回仪表板。我仔细研究了一下,现在我已经更新了我的答案。 – cameronhimself 2013-04-23 16:18:43

0

您可以使用此示例。

Mage::helper("adminhtml")->getUrl("module_name/controller_name/action_name", 
             array("param1"=>1,"param2"=>2)); 
+0

如果您启用了管理员URL密钥,这对大多数管理员URL不起作用,这是默认配置并且对安全性有好处。 – cameronhimself 2014-02-08 21:30:35

1

默认情况下,你不能,但因为这是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)));