我按照这篇文章http://www.the-art-of-web.com/php/dataexport/成功创建了一个从DB导出到csv文件,基于用户当前搜索视图。但是为了防止在导出发生时命中db,所以我禁用导出,除非视图或用户查询中有更改。我面临的问题是当用户点击导出文件时保存为确认对话框弹出,如果用户改变主意,请单击取消。导出按钮保持禁用状态。用户返回的唯一方法是更改查询并再次返回。
我的问题是,无论如何我可以捕获取消点击响应文件另存为确认对话框。
由于
代码与http://www.the-art-of-web.com/php/dataexport/非常相似,因为视图将是一个网格,其中包含来自给定日期范围的大量客户信息。如果用户喜欢他们选择的视图。他们会点击导出按钮。
示例代码 export.php
function exportCSV(){
document.getElementById("exportCSV").src = "test1.php";
document.getElementById("exportBtn").disabled = true;
}
function performSearch(){
//perform search get result and display
//if resultset length > 0
document.getElementById("exportBtn").disabled = false;
}
网格显示就在这里
< button id =“search”onclick =“performSearch()”>搜索
< button id =“exportBtn”onclick =“exportCSV()”>出口
< iframe id =“exportCSV”style =“display:none”/>
test1.php
$ data = array(
array(“firstname”=>“Mary”,“lastname”=>“Johnson”,“age”=> 25),
array(“firstname”=>“Amanda”,“lastname”=>“Miller”,“age”=> 18),
array(“firstname”=>“James”,“lastname”=>“Brown”,“age”=> 31),
array(“firstname”=>“Patricia”,“lastname”=>“Williams”,“age”=> 7),
array(“firstname”=>“Michael”,“lastname”=>“Davis”,“age”=> 43),
array(“firstname”=>“Sarah”,“lastname”=>“Miller”,“age”=> 24),
array(“firstname”=>“Patrick”,“lastname”=>“Miller”,“age”=> 27)
);
#filename供下载 $ filename =“website_data.xls”;
header(“Content-Disposition:application / octet-stream; filename = \”$ filename \“”);
header(“Content-Type:application / vnd.ms-excel”);
$ flag = false;
foreach($ data as $ row){
if(!$ flag){
#显示字段/列名称作为第一行
echo implode(“\ t”,array_keys($ row))。 “\ n” 个;
$ flag = true;
}
array_walk($ row,'cleanData');
echo implode(“\ t”,array_values($ row))。 “\ n” 个;
}
出口;
function cleanData(&$str)
{
$str = preg_replace("/\t/", "\\t", $str);
$str = preg_replace("/\r?\n/", "\\n", $str);
if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
}
答案 0 :(得分:0)
无法捕获浏览器事件以取消保存文件。在if语句中使用confirm(或类似的东西)可能是这种情况下最好的ux:
if(confirm('are you sure you want to export?'))
{
//export code
}
else
{
//cancel code
}
如果您希望重新启用导出按钮,则只要您调用用户的搜索(或他们为更改数据而执行的任何操作),我就会调用重新启用功能。或者,您也可以在点击导出按钮后使用setTimeout(),并在一段时间后重新启用它。
答案 1 :(得分:0)
也许你可以通过php脚本发送转储文件。在那里(再次:也许,我不知道,如果真的有效)可以用connection_status()测试连接状态。但是如果你通过php脚本发送文件,你就不需要知道状态了,因为如果脚本正常关闭,那么重要的是,如果传输完成了,如果你只想解锁数据库。
通常,正常的数据库转储是安全的。因此,如果您让数据库转储它包含的数据并将其保存到文件中,则在有人下载文件时没有理由锁定数据库。