Короткие и сладкие: поиск способа вызвать файл PHP и отображение прогресса с помощью jQuery и / или Ajax. Вызывается PHP-файл upgrade.php? Step = 1, а затем возвращаемый результат добавляется к #upgradestatus. По завершении этого процесса вызывается update.php? Step = 2, и этот вывод добавляется до тех пор, пока указанное количество шагов не будет завершено.
Объяснение: Я пытаюсь создать плагин для программного обеспечения, которое работает на PHP. Этот плагин будет вызывать каждый шаг через PHP-файл для обновления каждого файла и т. Д. Я хочу иметь возможность отображать прогресс на странице без перезагрузки, чтобы показать пользователю, что было сделано и где находится процесс.
Используя мой PHP-процесс, я хотел создать нечто похожее на это:
for (var s=0; s<2; s++){ $('#upgraderesult').load('upgrade.php', 'step=' + s, function() { $('#upgradestatus').append('Upgrade Step ' + s + ' Completed'); }); }
Я также попытался использовать .ajax (), и с помощью обоих этих методов я вскоре узнал, что будучи Async, это будет немного сложнее выяснить.
Моя мысль заключалась в том, чтобы создать цикл FOR, который будет цикл для количества шагов, которые есть. Тогда цикл for создаст необходимый код jQuery / Ajax, который добавит к существующему div #upgradestatus сообщение о состоянии. Я хотел, чтобы он добавлял результат, загруженный в #upgraderesult, но чтобы он оставался простым, я просто добавил «Шаг обновления X Complete».
Так что теперь я застрял и думаю, что мне просто нужно использовать PHP для генерации правильного кода jQuery / Ajax, но я хотел проверить и посмотреть, есть ли у кого-нибудь еще какие-либо мнения или предложения о том, как это можно сделать по-другому или даже если Я думаю об этом полном неведении.
Все, что я хочу, это иметь возможность вызвать PHP-файл на основе шага процесса, а затем отобразить прогресс для пользователя в браузере … который оказался намного сложнее, чем я думал.
Спасибо за любой вклад или рекомендации / предложения, я очень благодарен!
Все спасибо за ваш вклад, с помощью некоторых из парней в Freenode #jQuery мы смогли придумать это, что прекрасно работает:
var numSteps = 2; function loadStepAjax(s) { $.ajax('upgrade.php', { type: 'GET', dataType: 'html', data: { step: s }, success: function(data) { $('#upgradestatus').append(data); if (s < numSteps) loadStepAjax(s+1); } }); }
Затем вы вызываете функцию:
loadStepAjax(1);
Вместо использования цикла FOR мы создали функцию loadStepAjax и затем использовали оператор IF для обратного вызова, чтобы определить, следует ли снова вызвать функцию.
Это всегда что-то простое, не так ли! Спасибо за вклад каждого, однако, это очень ценится.
Вы можете установить обратный вызов для запуска, когда вы используете ajax (), (post () будет лучшей альтернативой). Вы попробовали это? У вас все еще есть код, когда вы пытались ajax ()?
Это должно быть что-то вроде этого.
$.post('upgrade.php?step=1', function() { $('#upgradestatus').append('Upgrade Step 1 Completed'); $.post('upgrade.php?step=2', function() { $('#upgradestatus').append('Upgrade Step 2 Completed'); $.post('upgrade.php?step=2', function() { $('#upgradestatus').append('All done!'); } } });
Конечно, вы также можете вернуть JSON и сказать «Да», все работает или что-то еще, но ключ заключается в том, что вы используете обратный вызов, чтобы подождать, пока он закончит, чтобы вызвать следующий шаг.
Есть еще один подход к этой проблеме.
Я написал исчерпывающий пример в качестве ответа на этот вопрос:
Обработка больших объемов данных на PHP без тайм-аута браузера
PS: Мой пример может быть расширен, чтобы также передавать сообщение о каждом прогрессе – на самом деле, он довольно гибкий; вы можете создать дату только части пользовательского интерфейса, который вы хотите, в соответствии с тем, что происходит на сервере, избавив клиента от ненужной обработки.