2012-06-06 47 views

回答

0

您可以使用此:

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

对不起,这是错误的。尽管Magento的某些管理员控制器提交了一个带有表单的'ajax'参数(有时候是一个'isAjax'参数),但也有许多Magento控制器(例如checkout)不会这样做。即使如此,现有的参数'ajax'也不能*告诉任何有关请求是否使用Ajax发送的信息。有一个简单的''在任何形式下都可以匹配您提交时的if条件。即使这种表格是由POST提交的。检查HTTP_X_REQUESTED_WITH标头可以让你更加可靠。 –

+0

实际上,这是正确的方式,一些Magento小部件使用IFrames,并附加ajax参数,因此检查HTTP_X_REQUESTED_WITH是无用的。 – skafandri

+1

我认为这取决于您如何定义“Ajax”。对我来说,这只是XmlHttpRequests。对你来说,这只是一个'ajax' params。对于Magento它似乎都是^^我更新了我的回答以反映这一点。 –

0

只要使用纯PHP和从不关心:

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

我永远不会理解那些使用ZFW,Magentoo等不同框架的人为此目的,U应始终记住不同的语法 - 为什么? - 只需使用一行代码,它将运行(更快,更安全)到处=) –

+1

我为其中一个人使用它们来避免冗余代码。 –

+0

冗余相当于FrameWork部分)包装器,懒惰的loding对象,多重继承所有这一切只需一次调用'$ this-> getRequest() - > getParam('ajax')' - 想象一下,每次用户运行时有多少代码正在执行你的应用程序的不同部分 - 有一个逻辑确定它是否是ajax或其他的东西,getRequest()(请求对象)的实例等...只是为了这个功能'return(boolean)((isset($ _ SERVER ['HTTP_X_REQUESTED_WITH']))&&($ _SERVER ['HTTP_X_REQUESTED_WITH'] =='XMLHttpRequest'));' –

28

Magento对其请求使用类Zend_Controller_Request_Http

您可以使用

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

检测Ajax请求这种方式。

至少

  • 原型
  • Scriptaculous的
  • jQuery的
  • MochiKit

发送HTTP_X_REQUESTED_WITH头,根据ZF docs

不过请注意,“Ajax请求”使用的XmlHttpRequest(并使用技术喜欢隐藏 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; 
} 

根据“阿贾克斯”您个人的看法,这可能(也可能不会)更好地满足您的需求。

+1

对于那些需要知道其他信息而不是控制器(如观察者)的人,可以使用'Mage :: app() - > getRequest() - > isXmlHttpRequest() – Meogi

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 
} 

在其他情况下,它会检查得到的参数就像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。