Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Magento 如何从前端控制器生成管理链接?_Magento - Fatal编程技术网

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

Magento 如何从前端控制器生成管理链接?,magento,Magento,我想有一个从前端页面到adminhtml页面的链接。我已尝试使用Adminhtml助手方法: Mage::helper('adminhtml')->getUrl('some/admin/path') 以及Adminhtml URL模型方法: Mage::getModel('adminhtml/url')->getUrl('some/admin/path') 但是没有用。每次我都会被踢到管理仪表板上。简短回答:你不能(除了少数例外——请参见本答案的底部),至少不能没有——安全风险

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

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,这是默认配置,并且有利于安全性。