webForumDet fria alternativet

Generera rapport via ajax, tvinga nedladdning vid POSTBACK

JavaScript

1 svar · 414 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej,

Har ett script för att generera PDF'er genom ett gränsnitt. Det funkar så att man gör ett val i två rullistor och sen genereras listan med hjälp av ajax och PHP.

Jag har en "laddar" ruta som visas under tiden rapporten skapas och har nu problem med att dölja den i samband med att rutan "Spara fil som" visas.

Såhär ser js ut (använder SACK):

function create_list(basename){
	var comp_id	 = document.getElementById('comp_id').options[document.getElementById('comp_id').selectedIndex].value;
	var doc_type = document.getElementById('doc_type').options[document.getElementById('doc_type').selectedIndex].value;
	if(comp_id != "foo" && doc_type != "foo"){
		mysack = new sack();
		mysack.requestFile	= "ajax.competition.create.list.php?comp_id=" + comp_id + "&doc_type=" + doc_type;
		mysack.onLoading	= function(){ overallHeight('site-overall'); showLayer('site-overall'); showLayer('site-loading'); };
		mysack.onError		= function(){ alert("create_list() failure: " + mysack.response + "\n"); };
		mysack.onCompletion	= function(){ 
							var result = mysack.response.split("|");
							var status = parseInt(result[0]);
							if(status == 200){
								alert(result[1]);

							}else{
								message = "Ett fel uppstod:\n";
								for(i = 1; i <= result.length - 1; i++){
									message += "  - " + result[i] + "\n"; 	
								}
								alert(message);
							}
							hideLayer('site-overall');
							hideLayer('site-loading');
						};
		mysack.runAJAX();
	}
}

PHP koden:

echo "200|Ok";

$stream = "I'm a text file...\n";
header("Content-type: text/txt;charset=utf-8");  
header("Cache-Control: no-store, no-cache");  
header("Content-Disposition: attachment; filename=\"foo.txt"); 
echo $stream;

Problemet är ju att när js tar emot "200|Ok" så slutar scriptet att köras. Vänder jag på det blir det också fel, eftersom headers redan har skickats.

Kan jag lösa det här med ob_start(); / ob_flush()?

Har sett liknande lösningar på andra ställen, bland annat använder Verticalresponse.com samma princip vid nedladdning av rapporter.

Någon som har förslag på lösning? Den här kanske passar bättre i PHP forumet, lite osäker..

Tack!

Medlem sedan feb. 20034 441 inlägg
#2

Löste det genom att lägga in window.open(url); i mysack.onCompletion.

261 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)