我正在覆盖magento控制器,在处理之前,有没有办法知道请求是否是由Ajax发送的?
由于
答案 0 :(得分:30)
Magento使用班级Zend_Controller_Request_Http
作为请求。
您可以使用
if ($this->getRequest()->isXmlHttpRequest()) {
// is Ajax request
}
以这种方式检测Ajax请求。
至少
根据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;
}