# Formular aktualisieren ohne reload



## 4eburator (19. Februar 2008)

*PHP-Formular aktualisieren*

Hallo Leute,

ich habe ein Problemm...
Ich bastele an einem Formular, wo die Formulardaten als PDF am Server zwieschengespeichert  und danach an Administrator + Kunde versandt werden.
Und das alles funktioniert mittlerweile, nur es soll noch überprüft werden ob das PDF auf dem Server vorhanden ist. Habe schon mit file_exsists versucht, dann bekomme ich ein weiteres Problemm. Da das PDF sich im zweitem Fenster öffnet, muß der Server noch ein mal auf PDF-existänz überprüft werden, sonst muß mann auf der Sende-Button zwei mal klicken.

Hat jemand irgend welche Idee, wie mann das am geschicktesten realisieren kann?

Ich bedanke mich im voraus!


----------



## Sven Mintel (19. Februar 2008)

Moin,

Könntest du das bitte ein wenig detaillierter beschreiben?
Rein vom Verständnis her.... du sendest das Formular, was hindert dich daran, sobald das Formular gesendet wurde, zuerst zu prüfen, ob die Datei schon da ist: Falls ja, gibst du eine betreffende Meldung aus, falls nicht, machst du das, was du vorhast(Daten speichern+Versenden).

Und worin besteht die JS-Problematik bei dieser Sache?


----------



## 4eburator (19. Februar 2008)

Hallo noch mal.

Es ist so, im Formular sind zwei Buttons vorhanden.
Eine ist für PDF zuständig, wen mann die betätigt wird ein PDF erstellt, auf dem Server gespeichert und im neuen Fenster angezeigt. Das funktioniert ja perfekt.
Die zweite ist Sende-Button, bei betätigen wird erstmal abgefragt ob PDF schon existiert.
Wenn nicht, wird ein Alert ausgegeben mit Hinweis auf "PDF erstellen". Wenn Datei vorhanden, das Formular wird versandt. Das funktioniert ja auch.
Nur nach der Alert ausgabe soll der Formular aktualisiert werden, weil feil_exists -Abfrage speichert das Ergebnis im Cache und die Schleife bedient sich mit alten Daten.
Einfache Aktualisierung vom Formular kann das Problemm lösen.
Ich habe schon mit reload versucht, nur dann bekommt man diesen Browser Infofenster, daß der Formular soll noch mal versendet werden. Meta und header brachten auch keine Erfolge.

Vieleicht denke ich zu kompliziert?


----------



## Sven Mintel (19. Februar 2008)

4eburator hat gesagt.:


> Einfache Aktualisierung vom Formular kann das Problemm lösen.
> Ich habe schon mit reload versucht, nur dann bekommt man diesen Browser Infofenster, daß der Formular soll noch mal versendet werden. Meta und header brachten auch keine Erfolge.
> 
> Vieleicht denke ich zu kompliziert?



Wenn es nur darum geht, das Formular neu zu Laden, ohne diese Meldung, dann probiers mal so:

```
location.replace('pfad/zur/formular.php?'+new Date().getTime());
```


----------



## 4eburator (19. Februar 2008)

Es hat geklappt mit neu Laden, leider sind alle Folmularinhalte verlören gegangen.
Warscheinlich wurde das Session abgebrochen.
Besteht die Möglichkeit, dabei die Daten beibehalten?


----------



## Sven Mintel (20. Februar 2008)

Jo...du sendest das Formular und nimmst das Meldungsfenster in Kauf 

Was genau gibt es denn an dem Formular zu aktualisieren, wenn der alert() ausgegeben wurde...was ändert sich dort?


----------



## 4eburator (20. Februar 2008)

An dem Formular selber, nichts.
Es soll nur der Cache aktualisiert oder file_exists noch ein mal ausgeführt werden, habe nur gedacht, daß der Formular zu aktualisieren geht am einfachsten.


----------



## kuddeldaddeldu (20. Februar 2008)

Hi,

ich hab' zwar den Ablauf immer noch nicht ganz verstanden, aber vielleicht hilft's, wenn Du einfach nach dem file_exists ein clearstatcache setzt.

LG


----------



## 4eburator (20. Februar 2008)

Hi,
eigentliche Problem ist die, nach dem ich das PDF-Dokument erstellt habe, muß das alles versandt werden. Und wenn ich auf die Sendebutton klicke, bekomme ich wieder das Alert mit der Aufforderung PDF zu erstellen, obwohl der schon exestiert. Erst wenn der Meldung weggeklickt wurde, die Seite und gleichzeitig der Cache aktualisiert wird. Und ab jetzt funktioniert alles wieder, wie es sein sollte.

Übrigens clearstatcache(); hat auch nichts gebracht.


----------



## kuddeldaddeldu (20. Februar 2008)

Hi,

clearstatcache ist auch Blödsinn, weil die Informationen ja nur innerhalb einer Instanz gespeichert werden. Gib doch mal dem Script, das die Prüfung macht einen Timestamp mit.

LG


----------



## 4eburator (20. Februar 2008)

Ich verstehe nicht ganz, wie das funktionieren soll.


----------



## kuddeldaddeldu (20. Februar 2008)

Und ich weiß nicht, wie Du das überhaupt realisiert hast...

Wie wird denn diese Prüfung, ob das PDF vorhanden ist gemacht?

LG


----------



## 4eburator (20. Februar 2008)

Mit dieser Funktion:


```
function pruefen() {
   if(!file_exists($_POST["name"].'.pdf')) {
         echo 'javascript:self();';
   } else {
         echo 'javascript:send();';
   }
}
```


----------



## Sven Mintel (20. Februar 2008)

Also du hast ein Problem, dass der Client was aus dem Cache geliefert bekommt?

Das ist eigentlich kein Problem 
Wie man das umgeht, siehst du in einem meiner vorrangegangenen Postings....hänge einen Timestamp an die URL(des PDFs oder des PHP-Skriptes, welches das Vorhandensein prüft)...heran, und du bekommst immer die allerfrischeste Ware  


```
'irgendeine.url?'+new Date().getTime()
```


----------



## kuddeldaddeldu (20. Februar 2008)

Mein Reden...


----------



## 4eburator (20. Februar 2008)

Sorry Leute,
ich habe schon den Timestamp an jeden Link angehängt es wil einfach nicht klappen.
Ich bekomme immer wieder den Alert zu sehen.


```
<script type="text/javascript">
function send() {
	document.form.action = "send.php?"+new Date().getTime();
	document.form.target = "_self";
}
function self() {
	document.form.action = "formular.php?"+new Date().getTime();
	document.form.target = "_self";
	alert("Bitte vorerst das PDF erstellen!");
}
function pdf() {
	document.form.action = "pdf.php?"+new Date().getTime();
	document.form.target = "_blank";
}
</script>
```


----------



## Sven Mintel (20. Februar 2008)

Ich glaube irgendwie, du musst da mal mehr Code Zeigen.

Wenn PHP sagt, das PDF ist nicht da, dann ist es nicht da!
Wo wird das PDF erstellt?


----------



## kuddeldaddeldu (20. Februar 2008)

Ich glaube, mir dämmert's langsam...


```
function pruefen() {
   if(!file_exists($_POST["name"].'.pdf')) {
         echo 'javascript:self();';
   } else {
         echo 'javascript:send();';
   }
}
```

Wo auch immer Du diese beiden JS-Funktionsaufrufe rein-echoest, sorge dafür, dass nach Erstellen und Anzeige des PDF's dies wieder geändert wird, indem Du z.B. vom Fenster, das das PDF darstellt, den Button, oder was auch immer, im Hauptfenster manipulierst.

LG


----------



## 4eburator (21. Februar 2008)

Guten Morgen,

Das PDF ist difinitiv da, ich muß ihn jedes mal nach dem missgelungenen Tests vom Server löschen. An dem ligt es nicht.
Und vor allem, nach dem PDF Erstellung und wiederholtem Alert, wenn man trotzt dem Alertanweisung noch ein mal auf senden geht, wird es versandt, wiel das Cache neue Daten bekommen hat.
Hier ist noch das Formular:

```
<form name="form" action="" method="post" target="">
    <input ... />
    <input ... />
    <input ... />
    <input name="PDF" type="submit" value="PDF erstellen" onclick="<? pdferstellen(); ?>" />
    <input name="submit" type="submit" value="senden" onclick="<? pruefen(); ?>" />
</form>
```
Das ist eigentlich alles, PHP und JS sind schon da.
Das PDF wird einfach vom Server downgeloadet und im neuem Fenster mit Adobe Reader angeteigt.


----------



## kuddeldaddeldu (21. Februar 2008)

Hi,

Dein Problem hat nichts mit dem Cache zu tun. Wenn Du auf PDF erstellen klickst, wird das Formular ja gar nicht abgeschickt. Entweder Du verlässt Dich drauf, dass das PDF erstellen geklappt hat und änderst das onclick vom Senden-Button per Javascript (was natürlich nicht so gut ist) oder Du prüfst die Existenz onsubmit per Ajax.

LG


----------



## 4eburator (21. Februar 2008)

Klingt interessant, nur ich kenne mich mit Ajax nicht aus.
Wenn es dir nich schwierig ist, kannst du mir ein Beispiel zeigen?


----------



## kuddeldaddeldu (21. Februar 2008)

Hi,

nö, das ist nicht schwierig. Da reicht schon ein leicht abgewandeltes Hallo Welt:


```
<html>
   <head>
      <script type="text/javascript">
	 try{
	    req = new XMLHttpRequest();
	 } catch (e){
	    try{
	       req = new ActiveXObject("Msxml2.XMLHTTP");
	    } catch (e){
	       try{
		  req = new ActiveXObject("Microsoft.XMLHTTP");
	       } catch (failed){
		  req = null;
	       }
	    }  
	 }
	 
	 function checkInput() {
	    req.open("GET", 'check.php?text=' + document.form1.text.value, true);
	    req.onreadystatechange = function(){            
	       switch(req.readyState) {
		  case 4:
		     if(req.status!=200) {
			alert("Fehler:"+req.status); 
		     }else{    
			if(req.responseText == "1") {
			   document.form1.submit(); //Prüfung erfolgreich -> Feuer!
			} else {
			   alert("Du hast nicht \"Hallo\" eingegeben!");
			}
		     }
		     break;

		  default:
		     return false;
		     break;     
	       }
	    };
	    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	    req.send(null);
	    return false; // wichtig, damit das Formular nicht abgesendet wird
	 }
	 
      </script>
   </head>
   <body>
<?php
   if(isset($_POST['text'])) {
      echo "<p>Formular mit Wert \"" . $_POST['text'] . "\" gesendet.</p>";
   }
?>
      <form name="form1" action="test.php" method="post" onsubmit="return checkInput();">
	 <input type="text" size="10" name="text">
	 <input type="submit" value="ab dafür">
      </form>
   </body>
</html>
```

Dazu eine check.php


```
<?php
   if(isset($_GET['text']) && $_GET['text'] == "Hallo") {
      echo "1";
   } else {
      echo "0";
   }
?>
```

Das solltest Du auf Deine Bedürfnisse anpassen können.

LG


----------



## 4eburator (21. Februar 2008)

Danke, probiere ich mal aus.


----------



## 4eburator (26. Februar 2008)

Hallo, 
sorry das ich wieder störe!
Mit Ajax komme ich auch nicht wirklich weiter, kann sein das ich  was falsch mache. 
Ich habe es so ausprobiert:

```
<script type="text/javascript">
function pdf() {
	document.form.action = "pdf.php";
	document.form.target = "_blank";
}

try {
req = new XMLHttpRequest();
} catch (e) {
	try {
		req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e){
		try {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (failed){
			req = null;
		}
	}
}
function checkInput() {
req.open("GET", 'check.php', true);
req.onreadystatechange = function() {
	switch(req.readyState) {
		case 4:
			if(req.status!=200) {
				alert("Fehler:"+req.status);
			} else {
			if(req.responseText == "1") {
				document.form.action = "send.php";
				document.form.target = "_self";
			} else {
				alert("Bitte vorerst das PDF erstellen! ");
			}
		}
		break;
		default:
			return false;
		break;
	}
};
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(null);
return false; // wichtig, damit das Formular nicht abgesendet wird
}
</script>
<form name="form" action="" method="post" target="">
    <input ... />
    <input ... />
    <input ... />
    <input name="PDF" type="submit" value="PDF erstellen" onclick="javascript:pdf();" />
    <input name="submit" type="submit" value="senden" onclick="javascript:checkInput();" />
</form>
```
check.php

```
<?php 
	if(file_exists($_POST["name"].'.pdf')) {
		echo "1";
	} else {
		echo "0";
	}
?>
```


----------



## kuddeldaddeldu (26. Februar 2008)

Hi,

Du übergibst den Namen aus dem Formular ja auch gar nicht an die check.php. Du musst den per Javascript auslesen und als URL-Parameter an  check.php anhängen. Ausserdem ist das ein GET-Request. Also musst Du in dem PHP-Script auch $_GET['name'] verwenden.

LG


----------



## 4eburator (27. Februar 2008)

Hallo,
ich habe es jtzt so versucht:


```
function checkInput() {
req.open("GET", 'check.php?name=' + document.form.name.value, true);
...
}
```

und in PHP auch auf GET abgeändert, trotzdem keine positive Resultate.
Da ist immer noch was Faul und ich finde es nich heraus was. 
Hast du vielleicht eine Idee?


----------



## kuddeldaddeldu (27. Februar 2008)

Hi,

dann musst Du halt mal Testausgaben machen. Was sagt die Fehlerkonsole?

LG


----------



## 4eburator (27. Februar 2008)

Meldung aus Fehlerkonsole:


> Fehler: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]"  nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: http://www.xyz.de/form.php :: anonymous :: line 32"  data: no]
> Quelldatei: http://www.xyz.de/form.php
> Zeile: 32



hier ist die Zeile 32: if(req.status!=200) {


----------



## kuddeldaddeldu (27. Februar 2008)

Hi,

Du sendest das Formular durch Deinen Submit-Button gleichzeitig ab. Mach' es mal, wie in meinem Beispiel über onsubmit oder versuch's mit:


```
<input name="submit" type="submit" value="senden" onclick="return checkInput();" />
```

Sollte eigentlich auch gehen.

LG


----------



## 4eburator (27. Februar 2008)

Hi, 
habe ich ausprobiert.
Bei onsubmit wird, egal was von Button du betätigst, 
immer auf "PDF erstellen" aufgevordert. 
Bei onclick dagegen, kann man wenigstens das PDF wirklich erstellen, danach bekommt man immer wieder das Alert.


----------



## kuddeldaddeldu (27. Februar 2008)

Hi,

warum ist "PDF Erstellen" eigentlich ein Submit-Button? Das macht doch gar keinen Sinn. 
Hast Du's jetzt mal mit dem return probiert?

LG


----------



## 4eburator (27. Februar 2008)

Ja, ich hab's mit return ausprobiert.

"PDF erstellen" war von anfang an ein Button, zum erstellen und anzeigen vom PDF's im neuen Fenster.


----------



## kuddeldaddeldu (27. Februar 2008)

Und was passiert dann? Was sagt die Fehlerkonsole? Jetzt lass' Dir doch nicht jedes Wort aus der Nase ziehen...


----------



## 4eburator (27. Februar 2008)

Dann passiert rein garnichts, Fehlerkonsole bleibt sauber (Fehlerfrei).


----------



## kuddeldaddeldu (27. Februar 2008)

Hi,

also kein Alert, sprich: die Prüfung war erfolgreich. Jetzt musst Du in diesem Fall das Formular nur noch mit document.form.submit() absenden. Bis jetzt biegst Du ja nur die action und das target um...

LG


----------



## 4eburator (27. Februar 2008)

Eben nicht, Alert wird immer wieder angezeigt, ob das PDF gar nicht exestiere.
Obwohl er auf dem Server vorhanden ist.


----------



## kuddeldaddeldu (27. Februar 2008)

Und warum erzählst Du mir dann, dass rein gar nichts passiert? Wozu frag' ich denn...

Zeig' mal Deinen Code, wie er jetzt ist.


----------



## 4eburator (27. Februar 2008)

Sorry! 
Hier ist di aktuelle Code:

```
<script type="text/javascript">
function pdf() {
	document.form.action = "pdf.php";
	document.form.target = "_blank";
}

try {
req = new XMLHttpRequest();
} catch (e) {
	try {
		req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e){
		try {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (failed){
			req = null;
		}
	}
}
function checkInput() {
req.open("GET", 'check.php?name=' + document.form.name.value, true);
req.onreadystatechange = function() {
	switch(req.readyState) {
		case 4:
			if(req.status!=200) {
				alert("Fehler:"+req.status);
			} else {
			if(req.responseText == "1") {
				document.form.action = "send.php";
				document.form.target = "_self";
			} else {
				alert("Bitte vorerst das PDF erstellen! ");
			}
		}
		break;
		default:
			return false;
		break;
	}
};
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(null);
return false; // wichtig, damit das Formular nicht abgesendet wird
}
</script>
<form name="form" action="" method="post" target="">
    <input ... />
    <input ... />
    <input ... />
    <input name="PDF" type="submit" value="PDF erstellen" onclick="javascript:pdf();" />
    <input name="submit" type="submit" value="senden" onclick="return checkInput();" />
</form>
```

check.php

```
<?php 
	if(file_exists($_GET["name"].'.pdf')) {
		echo "1";
	} else {
		echo "0";
	}
?>
```


----------



## kuddeldaddeldu (27. Februar 2008)

Ok,

dann ändere Deine check.php mal so um:


```
<?php 
    if(file_exists($_GET["name"].'.pdf')) {
        echo "1";
    } else {
        echo realpath($_GET["name"].'.pdf');
    }
?>
```

Und den alert mach mal so:


```
alert("Datei " + req.responseText + " existiert nicht!");
```

Stimmt der Pfad, der da ausgegeben wird?

LG


----------



## 4eburator (27. Februar 2008)

Ich bekomme jetzt Alert: Datei 1 existiert nicht!


----------



## kuddeldaddeldu (27. Februar 2008)

Hi,

probier's mal so:


```
if(req.responseText == 1) {
```

LG


----------



## 4eburator (28. Februar 2008)

Hey cool, Danke!

Also der Prüfung funktioniert schon mal, 
Fehlerkonsole bleibt rein und man bekommt kein Alert.
Es lag wirklich nur an Gänsefüsschen.

Nun muß das Formular versandt werden, das passiert aber nicht.
Ich habe schon mit document.form.submit(); versucht, wie du vorher gemeint hast, bekomme nur Fehlermeldung in Fehlerkonsole:

Fehler: document.form.submit is not a function
Quelldatei: http://www.xyz.de/form.php
Zeile: 36


----------



## kuddeldaddeldu (28. Februar 2008)

Hi,

sicher, dass Du Dich nicht vertippt hast? Das muss so gehen.

LG


----------



## 4eburator (28. Februar 2008)

also ich kann kein Tippfehler finden.


----------



## kuddeldaddeldu (28. Februar 2008)

Hi,

stell's mal online, dass man sich das anschauen kann.

LG


----------



## 4eburator (29. Februar 2008)

Hallo,

ich habe gerade festgestellt, dass das submit(); wird im unserem Fahl gar nicht funktionieren.
http://de.selfhtml.org/javascript/objekte/forms.htm#submit. Es überschneidet sich mit der Submitbutton.

Gibst vielleicht was anderes zum versenden?
Name soll 'submit' bleiben, sonst funktionirt das Versenden nicht mer.


----------



## kuddeldaddeldu (29. Februar 2008)

Hi,



> Gibst vielleicht was anderes zum versenden?
> Name soll 'submit' bleiben, sonst funktionirt das Versenden nicht mer.



Nein. Benenne den Submit-Button um. Wenn Du serverseitig irgendwo diesen Namen abfragst, musst Du das da halt auch ändern.

LG


----------



## 4eburator (29. Februar 2008)

Scheint zu funktionieren, nur noch eine kleinigkeit.

Nach dem Erstellen von PDF, geht man logischer Weise mit großtem Hofnung auf "senden". 
Und da passiert es, das PDF wir nochmal erstellt und angezeigt, und so mit jedem Sendeversuch.

Hast du irgend eine Idee, warum?


----------



## kuddeldaddeldu (29. Februar 2008)

Hi,

Du hast das submit() doch hoffentlich in den onreadystatechange-Handler gesetzt, nachdem Du die action auf "send.php" setzt? Dann sollte das nämlich eigentlich nicht passieren.

LG


----------



## 4eburator (29. Februar 2008)

Wie schon gesag, im Ajax blicke ich nicht viel, aber wie ich das beurteilen kann: denke schon.

Hier ist die Code:

```
<script type="text/javascript">
function pdf() {
	document.form.action = "pdf.php";
	document.form.target = "_blank";
}

try {
req = new XMLHttpRequest();
} catch (e) {
	try {
		req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e){
		try {
			req = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (failed){
			req = null;
		}
	}
}
function checkInput() {
req.open("GET", 'check.php?name=' + document.form.name.value, true);
req.onreadystatechange = function() {
	switch(req.readyState) {
		case 4:
			if(req.status!=200) {
				alert("Fehler:"+req.status);
			} else {
			if(req.responseText == 1) {
				document.form.submit();
			} else {
				alert("Datei " + document.form.name.value + ".pdf existiert nicht!\r\nSie müßen erst das PDF erstellen."); 
			}
		}
		break;
		default:
			return false;
		break;
	}
};
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.send(null);
return false; // wichtig, damit das Formular nicht abgesendet wird
}
</script>
<form name="form" action="send.php" method="post">
    <input ... />
    <input ... />
    <input ... />
    <input name="PDF" type="submit" value="PDF erstellen" onclick="javascript:pdf();" />
    <input name="senden" type="submit" value="senden" onclick="return checkInput();" />
</form>
```


----------



## kuddeldaddeldu (29. Februar 2008)

Hi,

und wie bist Du auf die Idee gekommen, diese beiden Zeilen


```
document.form.action = "send.php";
document.form.target = "_self";
```

da wieder rauszunehmen? Das müsste Dir doch klar sein, dass die action dann immer noch auf pdf.php steht...

LG


----------



## 4eburator (3. März 2008)

Hallo,

ich Depp, gar nichts daran gedacht.
Es funktioniert prima!

Besten Dank an alle Beteiligten!
Besonderes Dank an kuddeldaddeldu!


----------

