检查请求是否是由Ajax发送的

时间:2012-06-06 09:50:38

标签: ajax magento

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

由于

6 个答案:

答案 0 :(得分:30)

Magento使用班级Zend_Controller_Request_Http作为请求。

您可以使用

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

以这种方式检测Ajax请求。

至少

  • 原型
  • Scriptaculous的
  • 的jQuery
  • MochiKit

根据ZF docs发送HTTP_X_REQUESTED_WITH标题。

请注意,“Ajax请求”表示使用 XmlHttpRequest 发送的请求(使用隐藏<iframe>或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”的个人看法,这可能(或可能不)更符合您的需求。

答案 1 :(得分:9)

如果我没弄错,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

祝你好运! :)

答案 2 :(得分:1)

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();
}

请求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,因为它会检查Both。

答案 3 :(得分:0)

只使用纯PHP而不关心:

   public function isAjax()
   {
      return (boolean)((isset($_SERVER['HTTP_X_REQUESTED_WITH'])) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));
   }

答案 4 :(得分:0)

您可以使用:

if ($this->getRequest()->getParam('ajax')){
    //Ajax related code
} else {
    //Non ajax
}

答案 5 :(得分:0)

最好的方法是:

if (!$this->getRequest()->isAjax()) {
   return false;
}