我正在覆盖一个 magento 控制器,在处理之前,有没有办法知道请求是否由 Ajax 发送?
谢谢
Magento 使用该类Zend_Controller_Request_Http
来处理它的请求。
您可以使用
if ($this->getRequest()->isXmlHttpRequest()) {
// is Ajax request
}
以这种方式检测 Ajax 请求。
至少
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”的个人看法,这可能(也可能不会)更适合您的需求。
如果我没记错的话,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
祝你好运!:)
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 来检查两者。
最好的方法是:
if (!$this->getRequest()->isAjax()) {
return false;
}
只需使用纯 PHP,从不关心:
public function isAjax()
{
return (boolean)((isset($_SERVER['HTTP_X_REQUESTED_WITH'])) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'));
}
你可以使用这个:
if ($this->getRequest()->getParam('ajax')){
//Ajax related code
} else {
//Non ajax
}