我将数据发布到页面上,并进行了一些检查,这些检查需要5到6秒钟。我想插入一个等待页面以改善用户体验。 我的代码是这样的:
....functions that take time
echo $twig->render('template.html.twig',[ variables ....]);
因为PHP在处理完数据后最后调用了树枝模板,所以我无法使用JavaScript解决方案。
我尝试先渲染等待模板,然后处理数据并将输出存储在会话变量中,然后将位置标头发送到结果页面,但是我发现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
如何获得等待页面?
答案 0 :(得分:0)
您总是可以临时存储数据并为用户加载一个虚拟的“加载页面”。在加载虚拟页面时,您会发送一个ajax请求来恢复数据并处理它。当ajax调用返回时,您可以进行重定向或完成该过程后想要执行的任何操作。
当我说“临时存储数据”时,是指在数据库或文件等中。
答案 1 :(得分:0)
我最终要做的解决方案如下:
通过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']);
答案 2 :(得分:0)
最简单的解决方案是在首页内添加“等待页”,然后将其隐藏。当用户按下按钮时,浏览器将发送请求,但仍将等待显示旧页面的响应。在这里您可以使用JS展示它。 简而言之-用户按下按钮,将显示模板(该模板已经存在但已隐藏),然后浏览器仅等待模板在前面的响应。
但是最好的方法是使用Patriot建议的AJAX。