我的php应用程序中有很多像这样的ajax函数:
$.post('index.php?controller=suivi&action=ajax_intervention_save', {
id: root.find('#id').val(),
begin: begin,
end: end,
}, function(res) {
//if is not an ID
if (res && isNaN(res)) {
error();
SUIVI.showButton();
} else {
displaySuccess("Fiche saved");
}
});
当我有一个maintenance_mode == 1时,我想阻止对我应用程序的访问。因此,我添加了此条件:
$.post('index.php?controller=suivi&action=ajax_intervention_save', {
id: root.find('#id').val(),
begin: begin,
end: end,
}, function(res) {
if(res === 'MAINTENANCE'){
error(res);
return;
}
//if is not an ID
if (res && isNaN(res)) {
error();
SUIVI.showButton();
} else {
displaySuccess("Fiche saved");
}
});
我的问题是我在其他文件中有很多类似的功能。如何在所有功能中不复制代码res ==='MAINTENANCE'? 我希望有一种方法可以告诉我在mode == 1时可以显示所有ajax函数的“维护模式消息”
这是我的index.php重定向:
if(\app\models\Config::getValue('maintenance_mode')){
if (Tools::isAjax())
die('MAINTENANCE');
elseif(!isset($_GET['action']) || $_GET['action'] !== 'maintenance'){
header('Location:index.php?module=general&action=maintenance');
}
}
谢谢
答案 0 :(得分:0)
我认为最好的方法如下:您将拥有一个全局函数,该函数期望应调用的URL,以及一个与请求一起发送的信息的数组。
该函数应使用给定的注入信息来执行所有ajax请求。然后,将已实现的所有ajax调用更改为调用该函数。
有了这一点,您就可以在一点上进行所需的更改。
但是我想这个问题主要是基于观点的。
答案 1 :(得分:0)
在die()
之前,您可以设置一个不在200范围内的状态标头,因此会出错$.post
并且不将其称为成功回调。
header("HTTP/1.1 503 SERVICE UNAVAILABLE");
die('MAINTENANCE');
然后使用jQuery全局ajaxError()
在所有请求中查找该错误状态
使用张贴到http://httpbin.org/的示例,其中包含状态代码的测试路径
// will see all ajax errors in page
$(document).ajaxError(function(event, xhr) {
var maintenanceMessage = "SERVICE UNAVAILABLE" // default 503 message
if (xhr.status === 503 && xhr.statusText === maintenanceMessage) {
// do something to notify user of maintenance mode
console.log('Status::', [xhr.status, xhr.statusText])
}
// else ...do things for other errors also
});
// make simple request in order to trigger error
var url = 'http://httpbin.org/status/503';
$.post(url, function() {
console.log('Should not see this due to status code error')
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
请注意,有多种方法可以使用php设置状态标题,请参见https://stackoverflow.com/a/12018482/1175966
答案 2 :(得分:0)
如果您不想重构所有其他代码,则可以覆盖成功回调。您可以通过设置全局的beforeSend回调并更改success
对象的error
,options
或其他任何回调属性来实现此目的
$.ajaxSetup({
beforeSend:function(xhr,options){
//save the original callback
var original = options.success;
//setup the new callback
options.success = function(data){
if(data == "MAINTENANCE"){
error();
return;
}
//call the original callback if no error
original.apply(this,arguments);
}
}
})
请注意,但是如果ajax调用使用promise回调,则不会拦截它们。例如,如果您有:
$.post().then(function(){
//code
});
即使您设置了then()
,您的beforeSend
回调也会被调用。
答案 3 :(得分:0)
您可以尝试以下方法:
if(res !== 'MAINTENANCE'){
$.post('index.php?controller=suivi&action=ajax_intervention_save', {
id: root.find('#id').val(),
begin: begin,
end: end,
}, function(res) {
//if is not an ID
if (res && isNaN(res)) {
error();
SUIVI.showButton();
} else {
displaySuccess("Fiche saved");
}
});
}