我正在制作一份可以订购快递服务的表格。它的主要思想是生成包含经过验证的数据的PDF文件,然后将其附加到发送给客户+ cc的电子邮件中,用于快递公司。
事情是pdf生成(TCPDF)和电子邮件发送(Swiftmail)需要相当长的时间。
我想防止不耐烦的用户一遍又一遍地点击'确认'。理想的解决方案是显示一些gif'loading'图像左右。我已经研究过jquery .load()函数,对于这个问题来说它看起来是件好事,但是对于没有js的用户呢?
你能指出我正确的方向吗?
答案 0 :(得分:1)
超过98%的用户已激活javascript。剩下的2%是由:
Js现在被认为是理所当然的,它是一个网络标准。我会说不要担心并为此而努力 - 没有其他办法可以做到。不过,对于盲人来说,拥有一个<noscript>
标签,其中包含“操作可能需要几秒钟”的信息会很好。
答案 1 :(得分:1)
在这种情况下我会使用ajax。但如果缺少JS是你真正关心的问题,那么没有JS就有几种方法可以做到这一点。 首先,您可以在开始使用pdf之前向用户显示内容。例如
<?php
echo "<html><head></head><body> Please Wait..";
flush();
// process pdf here
?>
function flush()将强制Web服务器将数据发送到浏览器,因此在加载页面的其余部分时将显示该数据。但是有些浏览器会在内部缓存这个东西。有办法克服这个问题(在php.net中查看flush()函数的注释),但它可能会变得混乱。
另一种方法是异步处理PDF。在这种情况下,目标脚本只显示即将发送电子邮件的消息。然后发射实际发送它的剧本女巫。例如:
<?php
echo "<html><head></head><body> Email will be send out shortly </body></html>";
$params='';
foreach ($_POST as $name => $value) {
$params.=$name.'='.$value.'&';
}
if ($params!='')
$params=urldecode(substr($params,0,-1));
$parts=parse_url('process_pdf.php'.'?'.$params);
$fp = fsockopen('process_pdf.php',80, $errno, $errstr, 30);
$out = "POST ".$parts['path']." HTTP/1.1\r\n";
$out.= "Host: ".$parts['host']."\r\n";
$out.= "Content-Type: application/x-www-form-urlencoded\r\n";
$out.= "Content-Length: ".strlen($parts['query'])."\r\n";
$out.= "Connection: Close\r\n\r\n";
$out.= $parts['query'];
fwrite($fp, $out);
fclose($fp);
?>
在此示例中,“process_pdf.php”将获得与原始脚本相同的POST参数。但会在后台执行而不会中断原始页面。
答案 2 :(得分:0)
另一种方法是在后台作业中进行处理(创建PDF和发送电子邮件)。因此,当您使用单击“确认”时,将使用表单中的输入启动此后台作业,并向用户显示正在处理其作业的消息,并且他或她将很快通过电子邮件收到确认。这样,您就可以避免依赖Javascript。
您可以使用类似Beanstalkd的内容。