我将数据发布到一个页面,并进行一些检查,这需要5-6秒的时间。我想插入一个等待页面,以改善用户体验。我的代码是这样的:
....functions that take time
echo $twig->render('template.html.twig',[ variables ....]);因为PHP在处理数据之后会在最后调用twig模板,所以我不能使用javascript解决方案。
我尝试先呈现一个等待模板,然后处理数据并将输出存储在一个会话变量中,然后向结果页面发送一个location标头,但我发现PHP在完成整个脚本之前不会回显等待模板,即使我在开始时调用了它。
echo $twig->render('waiting.html.twig',[ variables ....]);
....functions that take time
store output as session variable.
send location header to another page that renders the template from the session variable如何实现等待页面?
发布于 2019-05-19 07:57:42
您总是可以临时存储数据,并为用户加载一个虚拟的“加载页面”。当虚拟页面加载时,您发送一个ajax请求来恢复数据并对其进行处理。当ajax调用返回时,您可以执行重定向,或者在流程完成后执行任何您想要执行的操作。
当我说“临时存储数据”时,我指的是数据库或文件等。
发布于 2019-05-27 22:05:53
我最终做的解决方案如下:
通过Ajax调用页面,显示等待页面。
function submit_form(file_method) {
var spinner = $('#loader');
spinner.show(); //show waiting div
var request = $.ajax({
url: "upload.php",
cache: false,
contentType: false,
processData: false,
async: true,
data: form_data,
type: 'POST',
success: function (res, status) {
if (status == 'success') {
window.location.href = 'results.php';
} },
error: function (jqXHR, textStatus,res) {
spinner.hide();
alert('Error encountered: '+textStatus+'-'+jqXHR.responseText);
} })
};在php页面中,将输出作为数组存储在会话变量中。
....functions that take time
$_SESSION['result'] = [RESULTS .......] 在ajax调用成功完成之后,用户被重定向到一个新页面。新页面使用会话变量来调用模板。
echo $twig->render('waiting.html.twig',$_SESSION['result'] );
unset($_SESSION['result']);发布于 2019-05-27 22:16:35
最简单的解决方案是在第一个页面中添加“等待页面”,但将其隐藏。当用户按下按钮时,浏览器将发送请求,但仍将等待显示旧页面的响应。在这里,您可以使用JS显示它。简而言之,用户按下按钮,你显示模板(它已经在那里,但隐藏),然后浏览器只是等待响应,你的模板在前面。
但最好的方法是按照爱国者的建议使用AJAX。
https://stackoverflow.com/questions/56203638
复制相似问题