В моем приложении 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 === 'ОБСЛУЖИВАНИЕ' во всех функциях? Мне нужен способ, который сообщает, что может отображать сообщение режима обслуживания для всех функций ajax, когда mode == 1
Это мое перенаправление 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');
}
}
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На мой взгляд, лучшим подходом было бы следующее: у вас была бы глобальная функция, которая ожидает URL-адрес, который должен быть вызван, и массив для информации, отправляемой с запросом.
Эта функция должна выполнять все ваши запросы ajax с введенной информацией. Затем вы бы изменили все свои вызовы ajax, которые вы еще реализовали, чтобы вызвать эту функцию.
С этим у вас будет одна единственная точка, где вы можете внести необходимые изменения.
Но я полагаю, что этот вопрос в первую очередь основан на мнении.
До die() вы могли установить заголовок состояния, который не находится в диапазоне 200, и, таким образом, приводил бы к ошибке $.post и не вызывал его успешный обратный вызов.
header("HTTP/1.1 503 SERVICE UNAVAILABLE");
die('MAINTENANCE');
Затем используйте jQuery global 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.info('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.info('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
Если вы не хотите реорганизовывать весь остальной код, вы можете переопределить обратный вызов успеха. Вы можете сделать это, настроив глобальный обратный вызов 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 используют обратные вызовы обещаний, это не перехватит их. Так, например, если у вас было:
$.post().then(function(){
//code
});
Ваш обратный вызов then() будет вызван, даже если у вас есть установка beforeSend.
Вы можете попробовать это:
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");
}
});
}
Спасибо за ответ, но это приведет к рефакторингу всего моего приложения и займет много времени. Вы можете дать мне экспресс-решение или идею?