Drupal 7: Flush () более одного ответа с Ajax - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть форма Drupal 7, где при отправке я вызываю функцию PHP через Ajax следующим образом:

$('input[id*="edit-validate"]').click(function (e) {
        var uploadcvPath = Drupal.settings.basePath + 'myfunction_submit';
        $.ajax({
            url: uploadcvPath,
            data: $('form').serialize(),
            xhrFields: {
                onprogress: function (e) {
                    var thisResponse, response = e.currentTarget.response;
                    if (lastResponseLen === false) {
                        thisResponse = response;
                        lastResponseLen = response.length;
                    } else {
                        thisResponse = response.substring(lastResponseLen);
                        lastResponseLen = response.length;
                    }
                    jsonResponse = JSON.parse(thisResponse);
                    $('.ajax-res p').text('Processed ' + jsonResponse.count + ' of ' + jsonResponse.total);
                    $(".progress-bar").css('width', jsonResponse.progress + '%').text(jsonResponse.progress + '%');
                }
            },
            success: function (response) {
                    alert('Success!!');
            },
            complete: function () {
                //Hide loading container
                alert('Done!!');
            },
            error: function (xmlhttp) {
                alert('An HTTP error ' + xmlhttp.status + ' occurred.\n' + uploadcvPath);
            },
        });
             e.preventDefault();
    });

Что я хочу сделать, это вернуть ответы для подачи индикатора выполнения, поэтому мой PHPфункция выглядит следующим образом:

function myfunction_submit() {

  //First response
  drupal_json_output(array('progress' => 50, 'count' => 50, 'total' => 50));
  flush();
  ob_flush();
  sleep(2);

  //Seconde response
  drupal_json_output(array('progress' => 80, 'count' => 80, 'total' => 80));
  flush();
  ob_flush();
  sleep(2);

}

Это прекрасно работает только с первым ответом, но когда я добавляю второй ответ, я получаю следующую ошибку:

Uncaught SyntaxError: Неожиданный токен {в JSON в позиции 37 в JSON.parse () в XMLHttpRequest.onprogress

позиция 37 соответствует секунде {в ответе JSON

{"progress":1,"count":1,"total":2}{"progress":2,"count":2,"total":2}

, что означает, что формат Json недействителен.Мой вопрос: есть ли проблема с функцией flush () в Drupal 7?потому что приведенный выше код прекрасно работает вне Drupal.

1 Ответ

0 голосов
/ 13 декабря 2018

Если у кого-то возникла эта проблема, я решил ее, используя

ob_end_flush(); 
ob_flush(); 
flush(); 
ob_start()

вместо

flush();
ob_flush();

Надеюсь, это когда-нибудь кому-нибудь поможет !!

...