Ajax: функция для предотвращения выполнения Ajax, если условие - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть много функций ajax в моем приложении php:

$.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');
}

}

Спасибо

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

Вы можете попробовать это:

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");
        }
    });
}
0 голосов
/ 10 сентября 2018

До die() вы могли бы установить заголовок состояния, который не находится в диапазоне 200 и, таким образом, мог бы выдавать ошибку $.post и не вызывать его успешный обратный вызов.

header("HTTP/1.1 503 SERVICE UNAVAILABLE");
die('MAINTENANCE');

Затем используйте jQuery global ajaxError() для поиска этого статуса ошибки по всем запросам


Пример использования post для 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

0 голосов
/ 10 сентября 2018

Если вы не хотите проводить рефакторинг всего своего другого кода, вы можете переопределить ваш успешный обратный вызов.Вы можете сделать это, настроив глобальный обратный вызов 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.

0 голосов
/ 10 сентября 2018

На мой взгляд, лучшим подходом было бы следующее: у вас есть глобальная функция, которая ожидает URL, который должен быть вызван, и массив для информации, отправляемой с запросом.

Эта функция должна выполнять все ваши ajax-запросы с заданной введенной информацией. Затем вы измените все ваши вызовы ajax, которые вы реализовали, на вызов этой функции.

При этом у вас будет одна единственная точка, в которой вы сможете внести необходимые изменения.

Но я полагаю, что этот вопрос прежде всего основан на мнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...