2

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

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

和 Adminhtml URL 模型方法:

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

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

4

4 回答 4

6

简短的回答:你不能(除了一些例外——见这个答案的底部),至少在不禁用管理 URL 密钥的情况下不能——这是一个安全风险。

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/view
  • adminhtml/sales_order/index
  • 所有 Oauth 操作。

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

public $_publicActions = array('index');
于 2013-04-22T22:24:03.510 回答
2

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

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

您可以创建一个管理控制器,它将充当代理以获取 url 密钥,然后重定向到您想要的路由,而无需禁用管理 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)));
于 2015-07-01T01:04:06.503 回答
1

链接到前端生成的管理员中的产品编辑页面

            $urlModel = Mage::getModel('core/url');
            $url = $urlModel->getUrl('adminhtml/catalog_product/edit', array(
                '_current' => false,
                'id' => $product->getId()
            ));
于 2013-04-23T06:21:21.373 回答
0

你可以通过这个例子来使用。

    Mage::helper("adminhtml")->getUrl("module_name/controller_name/action_name",
                                       array("param1"=>1,"param2"=>2));
于 2014-02-07T18:27:07.630 回答