2010-11-16 33 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