2013-04-22 34 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))); 
相關問題