如何从前端控制器生成管理链接?

时间:2013-04-22 22:24:04

标签: magento

我想要一个从前端页面到adminhtml页面的链接。我尝试过使用Adminhtml帮助方法:

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

和Adminhtml网址模型方法:

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

但无济于事。我每次都被踢到管理仪表板。

4 个答案:

答案 0 :(得分:6)

简短回答:你不能(除了少数例外 - 看到这个答案的底部),至少没有disabling admin URL keys - 这是一个安全隐患。

Magento哈希会话“表单密钥”以及管理URL路径,以生成其管理URL密钥。这个表单键只是一个随机的16个字符的字符串,只要会话持续就会持续。麻烦的是,Magento为前端和adminhtml区域使用了不同的会话cookie,因此使用了不同的表单密钥。

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

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


更新:查看一些Magento的adminhtml控制器,似乎默认情况下某些控制器操作不需要URL键:

  • adminhtml / catalog_product /编辑
  • adminhtml / catalog_product_review /编辑
  • adminhtml / sales_order的/视图
  • adminhtml / sales_order的/索引
  • 所有Oauth行动。

任何继承自Mage_Adminhtml_Controller_Action的控制器都可以通过将某些操作添加到$_publicActions数组来允许某些操作不需要管理员URL密钥。因此,对于您自己的模块,或者如果您正在覆盖Magento模块,如果您希望公开管理控制器中有indexAction,那么您可以这样做:

public $_publicActions = array('index');

答案 1 :(得分:1)

链接到前端

中生成的admin中的“产品编辑”页面
            $urlModel = Mage::getModel('core/url');
            $url = $urlModel->getUrl('adminhtml/catalog_product/edit', array(
                '_current' => false,
                'id' => $product->getId()
            ));

答案 2 :(得分:1)

默认情况下,您不能,但由于这是magento,您可以随时自定义它。

查看Redirection to Admin Customer Edit (with key) from a frontend controller

您可以创建一个管理控制器,它将像代理一样获取网址密钥,然后重定向到您想要的路由,而不会禁用管理网址密钥。

您可以使用$_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)));

答案 3 :(得分:0)

您可以通过此示例使用。

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