13

我正在覆盖一个 magento 控制器,在处理之前,有没有办法知道请求是否由 Ajax 发送?

谢谢

4

6 回答 6

37

Magento 使用该类Zend_Controller_Request_Http来处理它的请求。

您可以使用

if ($this->getRequest()->isXmlHttpRequest()) {
    // is Ajax request
}

以这种方式检测 Ajax 请求。

至少

  • 原型
  • 天经地义的
  • jQuery
  • 小唯
  • MochiKit

HTTP_X_REQUESTED_WITH根据ZF docs发送标头。

但请注意,“Ajax 请求”是指使用XmlHttpRequest(而不是使用隐藏<iframe>s 或 Flash 上传程序等技术)发送给我的请求。

由于这是主观的,您的看法可能会有所不同:Magento 本身似乎以比我更广泛的方式定义了“Ajax”。看看Mage_Core_Controller_Request_Http::isAjax()

public function isAjax()
{
    if ($this->isXmlHttpRequest()) {
        return true;
    }
    if ($this->getParam('ajax') || $this->getParam('isAjax')) {
        return true;
    }
    return false;
}

根据您对“Ajax”的个人看法,这可能(也可能不会)更适合您的需求。

于 2012-06-06T10:00:21.897 回答
11

如果我没记错的话,magento 是使用 Zend Framework 编写的,因此可以使用 Request 对象

if($this->getRequest()->isXmlHttpRequest()){
    // ajax
} else {
    // not ajax
}

http://framework.zend.com/manual/en/zend.controller.request.html#zend.controller.request.http.ajax

祝你好运!:)

于 2012-06-06T09:55:21.730 回答
2

Magento 在内部使用了两者的混合。

Zend Framework 的 isXmlHttpRequest() 检查标头。

public function isXmlHttpRequest(){
  return ($this->getHeader('X_REQUESTED_WITH') == 'XMLHttpRequest');
}

在某些情况下,magento 使用 isXmlHttpRequest() 就像在 Mage_ImportExport_Adminhtml_ExportController::getFilterAction()

if ($this->getRequest()->isXmlHttpRequest() && $data) {
  //code
}

在其他情况下,它检查 get 参数,如 Mage_Catalog_Product_CompareController::removeAction()

if (!$this->getRequest()->getParam('isAjax', false)) {
  $this->_redirectReferer();
}

Request Mage_Core_Controller_Request_Http::isAjax() 检查两者

public function isAjax()

{
    if ($this->isXmlHttpRequest()) {
        return true;
    }
    if ($this->getParam('ajax') || $this->getParam('isAjax')) {
        return true;
    }
    return false;
}

我建议使用 Request 对象 isAjax 来检查两者。

于 2015-09-30T01:40:51.817 回答
1

最好的方法是:

if (!$this->getRequest()->isAjax()) {
   return false;
}
于 2020-05-29T16:26:45.020 回答
0

只需使用纯 PHP,从不关心:

   public function isAjax()
   {
      return (boolean)((isset($_SERVER['HTTP_X_REQUESTED_WITH'])) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));
   }
于 2012-06-06T09:53:25.393 回答
0

你可以使用这个:

if ($this->getRequest()->getParam('ajax')){
    //Ajax related code
} else {
    //Non ajax
}
于 2012-06-06T09:54:05.117 回答