2010-11-16 31 views
0

我跟随此帖子http://www.the-art-of-web.com/php/dataexport/并成功创建从DB导出到csv文件,基于用户当前的搜索视图。但是为了防止在导出过程中碰到数据库,所以我禁用了导出,除非视图或用户查询中有更改。我面临的问题是当用户点击导出文件保存为确认对话框弹出,如果用户改变主意,点击取消。导出按钮保持禁用状态。用户返回的唯一方法是更改​​查询并再次返回。如何捕获文件保存为取消响应

我的问题是无论如何,我可以捕获点击回应文件保存为确认对话框。

感谢

的代码非常相似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; 
} 

网格显示右这里 <按钮ID = “搜索” 的onclick = “performSearch()”>搜索
<按钮ID = “exportBtn” 的onclick =” exportCSV() “>导出
< IFRAME ID =” exportCSV”风格= “显示:无”/>

test1.php

$数据=阵列(
阵列( “姓名”=> “玛丽”, “姓”=> “约翰逊”, “年龄”=> 25),
阵列( “姓名”=> “阿曼达” ,“姓氏”=>“米勒”,“年龄”=> 18),
array(“firstname”=>“Patricia”,“lastname”=>“Williams”,“age”=> 7),
array(“firstname”=>“Michael”,“lastname”=>“Davis”, (“firstname”=>“Patrick”=> 43),
array(“firstname”=>“Sarah”,“lastname”=>“Miller”,“age”=> 24),
array ,“姓氏”=>“米勒”,“一个ge“=> 27)
);

#下载文件名 $ filename =“website_data.xls”;

header(“Content-Disposition:application/octet-stream; filename = \”$ filename \“”);
header(“Content-Type:application/vnd.ms-excel”);

$ flag = false;
的foreach($数据作为$行){
如果(!$标志){
#显示字段/列名作为第一行
回声破灭( “\ t” 的,array_keys($行))。 “\ n” 个;
$ flag = true;
}
array_walk($ row,'cleanData');
echo implode(“\ t”,array_values($ row))。“\ n” 个;
}
exit;

function cleanData(&$str) 
{ 
    $str = preg_replace("/\t/", "\\t", $str); 
    $str = preg_replace("/\r?\n/", "\\n", $str); 
    if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; 
}  
+0

请张贴一些代码,也不需要在标题中有多个感叹号 – Woot4Moo 2010-11-16 20:26:47

+0

向我们显示javascript – Galen 2010-11-16 20:26:50

+0

该代码与http://www.the-art-of-web.com/非常相似php/dataexport /这里的视图将会是一个网格,其中包含来自给定日期范围的大量客户信息。如果用户喜欢他们选择的视图。他们会点击导出按钮。 – user332951 2010-11-16 21:31:27

回答

0

无法捕获用于取消保存文件的浏览器事件。在if语句(或类似的东西)使用的确认可能是对这种情况的最好UX:

if(confirm('are you sure you want to export?')) 
{ 
//export code 
} 
else 
{ 
//cancel code 
} 

如果你希望你的出口按钮变为重新启用我称之为一个重新启用的功能时,您的用户搜索(或者他们为改变数据所做的任何动作)被调用。或者您也可以在导出按钮被击中后使用setTimeout(),并在特定时间段后重新启用它。

+0

我不知道我们的质量保证人员是否会喜欢此解决方案。除了捕获响应,如果要在safari中执行相同的代码,则不会将该文件作为对话框确认,如果某种方法可以将文件保存为firefox的对话框,并且就像safari一样。 – user332951 2010-11-16 21:25:13

+0

这些是浏览器控制的操作,您无法更改它们如何操作或将事件附加到它们。我将重点关注何时根据代码的工作原理启用/禁用导出按钮。 – wajiw 2010-11-16 21:30:37

0

也许你可以通过php脚本发送转储文件。在那里你(再次:也许,我不知道,如果它真的有效)可以用connection_status()测试连接状态。但是,如果您通过php脚本发送文件,则不需要知道状态,因为如果脚本正常关闭,则无论如何,如果传输完成,如果您只想解锁数据库,则无关紧要。

无论如何,通常正常的数据库转储是安全的。因此,如果让数据库转储它所包含的数据并将其保存到文件中,那么在有人下载文件时就没有理由锁定数据库。

+0

为了安全起见,我无法将其保存到服务器上的文件中。许多组织的出口信息,每个组织都有大量的个人信息。 – user332951 2010-11-16 21:10:29

+0

要通过PHP发送转储,您不需要将其保存为文件。只需设置正确的标题并“回显”即可。 – KingCrunch 2010-11-17 11:46:02

+0

这就是我所做的,请查看发布的代码。 – user332951 2010-11-17 19:55:32