63130
Goto Top

Inputfeld im Popup mit einer live Synchonisation

Ich benötige ein Inputfeld in einem Popup (JavaScriptmäßig), das auf einem Link öffnet und nach "ok" drücken soll sich der Inhalt der eigentlichen Seite leicht verändern.

Aaaaalso: Hier ein Screenshot des aktuellen Standes:

http://img221.imageshack.us/img221/9460/untersuchungto5.jpg


Rot markiert ist der Link, auf den der Nutzer klicken soll. Da soll sich dann eine Inputbox in einem Popup (Wie mans ja von JavaScript kennt) öffnen. Hat der Nutzer dort seine Eingabe gemacht und OK Klickt, soll die änderung direkt statt dem alten "(Keine Beschreibung vorhanden)" erscheinen und der "Hinzufügen" Button soll zum Bearbeitenbutton werden. Der hat auch wieder eine inputbox, aber diesmal soll die den bereits eingegebenen Wert direkt wieder enthalten. Ganz unten soll dann noch ein "bestätigen" button unten hin, da kommt man auf die Seite, die alles in die Datenbank einträgt. Hat jemand eine Idee wie man sowas machen kann?


Hier noch den Quelltext des Seite:

<?php

	include ("include/db_connect.php");  
	
	Echo "<style type=\"text/css\">  

			body {
 			 background-color: #fff;
 			 margin: 40px;
 			 font-family: Lucida Grande, Verdana, Sans-serif;
			 font-size: 14px;
			 color: #4F5155;
			}

			a {
			 color: #003399;
			 background-color: transparent;
			 font-weight: normal;
			}

			h1 {
			 color: #444;
			 background-color: transparent;
			 border-bottom: 1px solid #D0D0D0;
			 font-size: 16px;
			 font-weight: bold;
			 margin: 24px 0 2px 0;
			 padding: 5px 0 6px 0;
			}

			code {
			 font-family: courier, Monaco, Verdana, Sans-serif;
			 font-size: 10px;
			 background-color: #f9f9f9;
			 border: 1px solid #D0D0D0;
			 color: #002166;
			 display: block;
			 margin: 14px 0 14px 0;
			 padding: 12px 10px 12px 10px;
			}

			h4 {
			 font-family: Lucida Grande, Verdana, Sans-serif;
			 font-size: 10px;
			 color: #4F5155;
			}

			h2 {
			 background-color: #fff;
			 font-size: 14px;
			 font-family: Lucida Grande, Verdana, Sans-serif;
			 text-align: right;
			}

			</style>";  
	
	Echo "<h1>Regelerfassung</h1>";  
	
	$time = getdate();
	$stamp = time();
	$zeit = $time[mday].".".$time[mon].".".$time[year];  
	
	$ziffer = $_POST[ziffer1];
	
	Echo "<br><br>Für die Regel wurde als Erstellungsdatum der <b>".$zeit."</b> erfasst.<br><br><br><br>";  
	
			$abfr = "SELECT titel  
						FROM vc_goae
						WHERE goae = $ziffer";  
			
			$besch = mysql_fetch_array(mysql_query($abfr));
			$beschreibung = $besch[titel];
			
	if (!empty($beschreibung)){
	$leistung = "(<i>".$beschreibung."</i>) ";}  
	
	Echo "Die eingegebene Regel besagt, dass Ziffer ".$ziffer." ".$leistung."nicht neben folgenden Ziffern berechnet werden darf:<br><br><br>";  
	
	$zaehler = 1;
	$x = 0;

	Echo "<table border=\"0\" width=\"70%\">";  
	do {
		$z = "ziffer".$zaehler;  
		
		if (!empty($_POST[$z])) {
		
			$abfrage = "SELECT id, goae, titel  
						FROM vc_goae
						WHERE goae = $_POST[$z]";  
			
			$eab = mysql_fetch_array(mysql_query($abfrage));
			
			$b = $eab[titel];
			
			if ($erf = 1){$add = "<a href=\"leistung_neu.php?ziffer=".$_POST[$z]."\" Target=\"_blank\">Hinzufügen</a>";}	  
			
			if (empty($b)){$b = "<i>(Keine Beschreibung vorhanden)</i> ".$add."";}  
			
			Echo "<tr>  
					<td>$_POST[$z]<br><br></td>
					<td>$b<br><br></td>
				  </tr>";  
			
			$zaehler = $zaehler + 1;
			
		} else {$x = 1;}
	
	} while ($x != 1);
	
	Echo "</table>"  
	

?>

Content-Key: 98056

Url: https://administrator.de/contentid/98056

Printed on: April 19, 2024 at 05:04 o'clock

Member: dtzzzzzz
dtzzzzzz Sep 30, 2008 at 07:56:58 (UTC)
Goto Top
Wieso trennt hier keiner PHP-Code und Template-Code (HTML). Das ist doch viel zu umständlich, so zu programmieren. Kann ich nur hier das empfehlen:

http://www.smarty.net/

Ok, zu deiner Frage nun: in deinem Link musst du den Aufruf einer Funktion im JavaScript machen, die dann ein neues Fenster erstellt. Dort lädst du dein Formular-Template rein, wo die Eingaben gemacht werden.

Danach würde ich mit AJAX arbeiten, denn dann kannst du die erstellten Daten, ohne Seite neu zu laden, direkt abspeichern und nur die eine Zeile neu laden, wo die neue Daten eben hingehören, oder zumindest einen Block. Das Pop-Up-Fenster wird einfach nach dem Speichern geschlossen und das Hauptfenster, genau gesagt der Inhalt wird neu geladen.

Das wäre der Ablauf. Ich frage dich jetzt ein Mal, ob du AJAX und JavaScript bereits kannst, oder ob du dort auch hilfe brauchst.

Und ich empfehle jedem hier Templates von dem PHP-Code zu trennen, dann spart man sich diese echo mit dem HTML mitten im PHP-Code. Und noch ein Vorteil: Ihr könnt beliebig viele Layouts machen, verändern, erstellen, ohne dabei jedes Mal PHP-Code zu ändern und umgekehrt, PHP-Code ändern, ohne dabei alle Templates auch noch zu ändern.
Mitglied: 63130
63130 Sep 30, 2008 at 08:30:21 (UTC)
Goto Top
JavaScript bekomme ich hin, ist zwar ne weile her aber das schaffe ich wohl noch. Von AJAX habe ich allerdings überhaupt keine Ahnung.

Das mit dem trennen wird später noch gemacht. Ich soll das Ding nur erstmal möglichst schnell zum laufen kriegen.
Member: dtzzzzzz
dtzzzzzz Sep 30, 2008 at 08:39:07 (UTC)
Goto Top
Ok, dann baue mal schon alles mit JavaScript ein (Fenster öffenen, Fenster schliessen, Fenster durchladen). Um Daten abzuspeichern, brauchst du noch eine PHP-Datei z. B. save_data.php, die du am besten in ein Verzeichnis rein tust, wo kein Zugriff von aussen möglich wäre (also mit .htassecc schützen). Diese Datei macht nichts anders, als die Daten updaten oder z. B. einfügen.

Außerdem brauchst du noch prototype.js -Framework. Die AJAX -Funktion in diesem Fall ist recht einfach und ich schreibe sie dir, wenn du den Rest fertig hast.
Mitglied: 63130
63130 Sep 30, 2008 at 09:04:28 (UTC)
Goto Top
In welcher Form muss ich die Daten an die Datei save_data.php senden? Als Postdaten?
Member: dtzzzzzz
dtzzzzzz Sep 30, 2008 at 09:21:57 (UTC)
Goto Top
diese werden von AJAX in Form von Postdaten gesendet, da musst du nichts machen. Also kein Formular <form></form> machen, sondern nur Fälder einbauen und am Ende ein Button der ein onClick - Event hat. Dadurch wird dann entsprechende Funktion aufgerufen in JavaScript, wo dann AJAX läuft und die Daten an die save_data.php sendet, die dann wiederum diese in die DB abspeichert.

Wie gesagt, machen wir Schritt für Schritt am besten. Mach mal erst ein Mal das Pop-Up-Fenster fertig. und die save_data.php kannst du schon so vorbereiten, dass dort alle Sachen mit SQL usw. stehen.
Mitglied: 63130
63130 Sep 30, 2008 at 11:22:58 (UTC)
Goto Top
Ok also nun öffnet sich das entsprechende Popupfenster, wenn man auf Hinzufügen klickt. So sieht das ganze im Quellcode aus (Das öffnen-script):

<?php

	include ("include/db_connect.php");  

                Echo "<h1>Regelerfassung</h1>";  
	
	$time = getdate();
	$stamp = time();
	$zeit = $time[mday].".".$time[mon].".".$time[year];  
	
	$ziffer = $_POST[ziffer1];
	
	Echo "<br><br>Für die Regel wurde als Erstellungsdatum der <b>".$zeit."</b> erfasst.<br><br><br><br>";  
	
			$abfr = "SELECT titel  
						FROM vc_goae
						WHERE goae = $ziffer";  
			
			$besch = mysql_fetch_array(mysql_query($abfr));
			$beschreibung = $besch[titel];
			
	if (!empty($beschreibung)){
	$leistung = "(<i>".$beschreibung."</i>) ";}  
	
	Echo "Die eingegebene Regel besagt, dass Ziffer ".$ziffer." ".$leistung."nicht neben folgenden Ziffern berechnet werden darf:<br><br><br>";  
	
	$zaehler = 1;
	$x = 0;

	Echo "<table border=\"0\" width=\"70%\">";  
	do {
		$z = "ziffer".$zaehler;  
		
		if (!empty($_POST[$z])) {
		
			$abfrage = "SELECT id, goae, titel  
						FROM vc_goae
						WHERE goae = $_POST[$z]";  
			
			$eab = mysql_fetch_array(mysql_query($abfrage));
			
			$b = $eab[titel];
			
			if ($erf = 1){$add = "	<script language=\"javascript\" type=\"text/javascript\">  
										function popitup(url) {
										newwindow=window.open(url,'name','resizable=no,height=200,width=470,dependent=yes,hotkeys=no,location=no,scrollbars=no,status=no,toolbar=no');  
										if (window.focus) {newwindow.focus()}
										return false;
										}
									</script>
									<a href=\"maske.php?ziffer=$_POST[$z]\" onclick=\"return popitup('maske.php?ziffer=$_POST[$z]')\">Hinzufügen</a>  
								";}	  
			
			if (empty($b)){$b = "<i>(Keine Beschreibung vorhanden)</i> ".$add."";}  
			
			Echo "<tr>  
					<td>$_POST[$z]<br><br></td>
					<td>$b<br><br></td>
				  </tr>";  
			
			$zaehler = $zaehler + 1;
			
		} else {$x = 1;}
	
	} while ($x != 1);
	
	Echo "</table>"  
	

?>

Aus Platzgründen ohne CSS

Und hier ist das Popup Fenster:

<?php

Echo "<h1>Leistung erfassen</h1><br>  
<p>Bitte geben Sie eine Leistungsbeschreibung zu Ziffer ".$_GET[ziffer]." ein:<br></p>  
<input type=\"text\" name=\"beschreibung\" size=\"70\"><input type=\"hidden\" name=\"ziffer\" value=\"".$_GET[ziffer]."\"><br><br>  
<input type=\"button\" value=\"Speichern\" onclick=\"\"> ";  

?>
(ebenfalls ohne CSS)


Die Dateien die jetzt im Verzeichnis liegen sind folgende:

eingabe.php (unrelevante Datei, ich für was anderes brauche)
eintragung.php (Die Seite auf dem Screenshot ganz oben)
maske.php (Das Popup)
prototype-1.6.0.3.js (Das ist das runter geladene Framework)
save_data.php (leer)

Wie muss ich jetzt weiter machen?
Member: dtzzzzzz
dtzzzzzz Sep 30, 2008 at 12:00:31 (UTC)
Goto Top
Ok, nun würde ich prototype-1.6.0.3.js zu prototype.js umbennen und in einen neuen Ordner, z. B. javascript einfügen.

Dann muss du die Datei einbinden in eintragung.php, bzw. im entsprechenden Tamplate.

<script type="text/JavaScript" src="javascript/prototype.js"></script>  

Nun brauchst du noch ein Script für AJAX:

<script type="text/JavaScript">  
function saveDataAjax(zahl){
var data = '';  

// Prüfen, ob alle Daten vorhanden sind
if(self.document.getElementsByName('beschreibung') && self.document.getElementsByName('ziffer') && zahl){  
// Sicherheitsfrage
qu = confirm("Möchten Sie wirklich diese Daten editieren?");  
if(qu == false)return;

// Daten sammeln
data = data+'&beschreibung='+self.document.getElementsByName('beschreibung').value;  
data = data+'&ziffer='+self.document.getElementsByName('ziffer').value;  

// Daten abschicken
new Ajax.Request('save_data.php',			{method:'post',  
postBody: data,					onSuccess: function(input){
// Wenn Daten erfolgreich gespeichert wurden
alert('Daten wurden erfolgreich gespeichert.');  
// Pop-Up-Fenster schliessen Funktion hier aufrufen!							 }
onFailure: function(input){
// Wenn die Daten nicht gespeichert wurden								alert('FEHLER!');						 } 
}						);		
}
}
</script>

Somit wird nun die save_data.php im Hintergrund geladen und die Daten in der Variable $_POST['beschreibung'] und $_POST['ziffer'] an die php-Datei übergeben. Dort kannst du diese Daten ganz normal abrufen und in die DB abspeichern.

Da du mit 2 Fenster arbeitest, denk auch daran, wie du eine JavaScript Funktion aufrufst. Somit musst du noch in deinem onClick - Event dann eben diese Funktion aufrufen lassen saveDataAjax als Argument übergibst du ihr dann entsprechnd die Zahl.

Falls noch Fragen sind, dann frag einfach.
Mitglied: 63130
63130 Sep 30, 2008 at 12:25:28 (UTC)
Goto Top
Kannst du mir mal genau schreiben was ich in di Onclick schreiben muss? ich hab jetzt die Ajax Funktion in die Seite "Maske" eingegeben und das mit dem Aufrufen der Funktion klappt aber nicht.

Wenn ich das richtig sehe kann ich in der save_data.php dann einfach die ziffer und beschreibung aus den $_POST Variablen holen und in die Datenbank schreiben?
Member: dtzzzzzz
dtzzzzzz Sep 30, 2008 at 16:25:01 (UTC)
Goto Top
Ok, hier ist die Version, die bei mir funktioniert:

eintragung.php

<?php
	include ("include/db_connect.php");  

        echo "<h1>Regelerfassung</h1>";  
	
	$time = getdate();
	$stamp = time();
	$zeit = $time[mday].".".$time[mon].".".$time[year];  
	
	$ziffer = $_POST[ziffer1];
	
	echo "<br><br>Für die Regel wurde als Erstellungsdatum der <b>".$zeit."</b> erfasst.<br><br><br><br>";  
	
			$abfr = "SELECT titel  
						FROM vc_goae
						WHERE goae = $ziffer";  
			
			$besch = mysql_fetch_array(mysql_query($abfr));
			$beschreibung = $besch[titel];
			
	if (!empty($beschreibung)){
	$leistung = "(<i>".$beschreibung."</i>) ";}  
	
	Echo "Die eingegebene Regel besagt, dass Ziffer ".$ziffer." ".$leistung."nicht neben folgenden Ziffern berechnet werden darf:<br><br><br>";  
	
	$zaehler = 1;
	$x = 0;

	Echo "<table border=\"0\" width=\"70%\">";  
	do {
		$z = "ziffer".$zaehler;  
		
		if (!empty($_POST[$z])) {
		
			$abfrage = "SELECT id, goae, titel  
						FROM vc_goae
						WHERE goae = $_POST[$z]";  
			
			$eab = mysql_fetch_array(mysql_query($abfrage));
			
			$b = $eab[titel];
			
			if ($erf = 1){$add = "	<script language=\"javascript\" type=\"text/javascript\">  
										function popitup(url) {
										newwindow=window.open(url,'name','resizable=no,height=200,width=470,dependent=yes,hotkeys=no,location=no,scrollbars=no,status=no,toolbar=no');  
										if (window.focus) {newwindow.focus()}
										return false;
										}
									</script>
									<a href=\"maske.php?ziffer=$_POST[$z]\" onclick=\"return popitup('maske.php?ziffer=$_POST[$z]')\">Hinzufügen</a>  
								";}	  
			
			if (empty($b)){$b = "<i>(Keine Beschreibung vorhanden)</i> ".$add."";}  
			
			echo "<tr>  
					<td>$_POST[$z]<br><br></td>
					<td>$b<br><br></td>
				  </tr>";  
			
			$zaehler = $zaehler + 1;
			
		} else {$x = 1;}
	
	} while ($x != 1);
	
	echo "</table>"  
	

?>

maske.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
"http://www.w3.org/TR/html4/loose.dtd">  
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
<meta name="language" content="de">  
<title>Test</title>

<script type="text/JavaScript" src="javascript/prototype.js"></script>  
<script type="text/JavaScript" src="javascript/functions.js"></script>  

<body>

<?php

Echo "<h1>Leistung erfassen</h1><br>  
<p>Bitte geben Sie eine Leistungsbeschreibung zu Ziffer ".$_GET[ziffer]." ein:<br></p>  
<input type=\"text\" id=\"beschreibung\" size=\"70\"><br><br>  
<input type=\"button\" value=\"Speichern\" onclick=\"saveDataAjax(".$_GET[ziffer].")\"> ";  

?>
</body>
</html>

außerdem habe ich JavaScript in eine gesonderte Datei ausgelagert:

functions.js

function saveDataAjax(zahl){
	var data = '';  

	// Prüfen, ob alle Daten vorhanden sind
	if(self.document.getElementById('beschreibung') && zahl){  
		// Sicherheitsfrage
		qu = confirm('Möchten Sie wirklich diese Daten editieren?');  
		if(qu == false)return;
	
		// Daten sammeln
		data = data+'&beschreibung='+self.document.getElementById('beschreibung').value;  
	
		// Daten abschicken
		new Ajax.Request('save_data.php',			  
							{method:'post',  
							postBody: data,					
								onSuccess: function(input){
									// Wenn Daten erfolgreich gespeichert wurden
									alert('Daten wurden erfolgreich gespeichert.');  
									// Pop-Up-Fenster schliessen Funktion hier aufrufen!
								 },
								onFailure: function(input){
									// Wenn die Daten nicht gespeichert wurden	
									alert('FEHLER!');  
								}
							}
		);		
	}
}

und schliesslich save_data.php

<?PHP
  //  Hier kommt das Update rein
  echo "HIER BIN ICH";  
?>

Außerdem empfehle ich dir zum Testen von AJAX/JavaScript Sachen und auch natürlich vielen anderen im Browser Firefox das Add-On Firebug. Damit kannst du alle Infos ablesen! Sehr hilfreich!
Mitglied: 63130
63130 Oct 01, 2008 at 06:16:35 (UTC)
Goto Top
Ok jetzt funktionierts auch face-smile


Nur noch 2 Punkte:

Kann ich jetzt noch mit dem Popup "Die Daten wurden gespeichert" auch das Eingabepopup schließen lassen?

Ist es Möglich, dass sich in der Eintragung.php (Siehe Screenshot erster Post) die Daten auch gleich mit ändern? Also dass dann da statt "Keine Beschreibung vorhanden" die neu eingegebene Beschreibung direkt angezeigt wird? Eine Möglichkeit wäre da, dass wenn man in dem Popup "Die Daten wurden gespeichert" Ok klickt das Hauptfenster alle Ziffern nochmal per POST an sich selbst schickt und dann diesmal aus der Datenbank die neue Beschreibung mit lädt. Geht das? Und wie?
Member: dtzzzzzz
dtzzzzzz Oct 01, 2008 at 07:51:00 (UTC)
Goto Top
Natürlich kann du dann im JavaScript, nach dem die Daten gespeichert wurden, das Fenster schliessen lassen und du kannst ebenfalls das andere Fenster einfach neu laden lassen. Das wäre eine einfachere Lösung. Du kannst auch beim Neuladen des Fenster auch ein URL dort übergeben, so als wenn einer das Fenster durch einen Link aufrufen würde. Im URL kannst du dann alle deine Variablen mitübergeben.
Member: godlie
godlie Oct 01, 2008 at 11:00:18 (UTC)
Goto Top
Hm also das mit der htaccess wird nicht funktionieren, da du dann bei jedem aufruf dich "anmelden" müsstest, oder lieg ich da grad sehr falsch?
Mitglied: 63130
63130 Oct 01, 2008 at 11:05:55 (UTC)
Goto Top
Hast du vielleicht dazu auch ein Script? Ich weiß nämlich nicht wie ich den "ok" Button mit den entsprechenden Aktionen (Nachladen der Stammseite, schließen der Eingabemaske) belegen kann.
Member: dtzzzzzz
dtzzzzzz Oct 01, 2008 at 12:57:13 (UTC)
Goto Top
Zitat von @godlie:
Hm also das mit der htaccess wird nicht funktionieren, da du dann bei
jedem aufruf dich "anmelden" müsstest, oder lieg ich da
grad sehr falsch?

Da liegst du grade sehr falsch, da dort nur die Daten stehen, dass dieser Ordner von aussen nicht direkt ansprechbar wäre. Also, wenn einer das im Browser eingibt:

http://meinewebseite.de/include

Würde er dann keine Auflistung der Dateien bekommen, sondern eine Fehlermeldung, dass der Zugriff verweigert wurde. Somit kann keiner auf die Daten zugreifen, bzw. die Namen der Dateien ermitteln etc.

PHP-Script läuft aber auf dem Server und somit hat immer Zugriffsrechte darauf. Denn die Scripte werden nicht als solche zum Client übertragen, sondern dienen nur zum Generieren von dynamischen HTML-Seiten, die dann übertragen werden.

Bei den Ordnern mit den Bildern kann man das aber nicht so machen, da diese ja zum Client übertragen werden müssen. Somit kann man Bilder immer über einen direkten Link erreichen. Was man gegen Auflistung eines Ordners mit den Bildern machen könnte, um somit zumindest den Zugriff zu erschweren, eine index.htm in so einen Ordner packen, wo z. B. steht: "<h2>Bitte keinen direkten Link nutzen!</h2> Somit, wenn man z. B. das angibt:

http://www.meinewbseite.de/images

Dann nur die obere Meldung erhält und nicht die Liste aller Bilder.


Zitat von @63130:
Hast du vielleicht dazu auch ein Script? Ich weiß nämlich
nicht wie ich den "ok" Button mit den entsprechenden
Aktionen (Nachladen der Stammseite, schließen der Eingabemaske)
belegen kann.

Du brauchst nur nach dieser Zeile alert('Daten wurden erfolgreich gespeichert.'); in der Datei functions.js noch das einfügen:

window.parent.location.href = url;

wobei in url übergibst du den Link mit allen Parametern zum Reloaden.

Und danach schliesst du das Pop-Up-Fenster:
window.close();


Ich habe das nicht getestet, daher musst du vielleicht bei de.selfHTML.org nachschauen, wie man verschiedene Fenster genau anspricht, muss aber so ungefähr sein.
Member: godlie
godlie Oct 01, 2008 at 13:00:24 (UTC)
Goto Top
Achso ich dachte an eine HTTP Auth geschichte mit htaccess.
Das du ein NonDirectoryListing meintest darauf bin ich nicht gekommen.
Mitglied: 63130
63130 Oct 02, 2008 at 07:55:17 (UTC)
Goto Top
Also ich hab die functions.js jetzt so modifiziert, dass sie eigentlich sowohl die eine Seite nachladen als auch das Popup schließen sollte. Doch funktioniert das nicht ganz. Das Popup schließt zwar, aber das Nachladen geht nicht. Siehe Zeile 18 und Zeile 19:

function saveDataAjax(zahl){
	var data = '';  

	// Prüfen, ob alle Daten vorhanden sind
	if(self.document.getElementById('beschreibung') && zahl){  
	
		// Daten sammeln
		data = data+'&beschreibung='+self.document.getElementById('beschreibung').value;  
	
		// Daten abschicken
		new Ajax.Request('save_data.php',			  
							{method:'post',  
							postBody: data,					
								onSuccess: function(input){
									// Wenn Daten erfolgreich gespeichert wurden
									alert('Daten wurden erfolgreich gespeichert.');  
									// Pop-Up-Fenster schliessen Funktion hier aufrufen!
									opener.reload();
									window.close();
								
								 },
								onFailure: function(input){
									// Wenn die Daten nicht gespeichert wurden	
									alert('FEHLER!');  
								}
							}
		);		
	}
}

Irgendeine Idee was ich falsch mache?

Achja und bei save_data.php kommen aus irgendeinem Grund keine POST Daten an. Ich weiß nicht woran das liegen könnte.
Member: dtzzzzzz
dtzzzzzz Oct 02, 2008 at 08:36:33 (UTC)
Goto Top
Vermutlich, weil AJAX Script im neuen Fenster geladen wurde und daher "das alte Fenster" nicht kennt. Musst du ein bisschen ausprobieren, z. B. function.js im Hauptfenster laden und dann in onClick-Event noch opener.saveDataAjax ersetzen, damit das Pop-Up-Fenster auf die Funktion aus dem Hauptfenster zugreift. Danach musst du natürlich auch noch JS ändern, so dass reload() nun dann auf sich selbst angewendet wird usw.

Dass die Post Variablen nicht da sind, kannst du mit Firebug für Firefox rausfinden, ob diese überhaupt übergeben werden. Ich könnte vermuten, dass du in deinem Formular vergessen hast statt name="beschreibung" id="beschreibung" zu machen, da JavaScript nach elementById abfragt und somit logischerweise keine Werte bekommt, wenn du aber dort name="beschreibung" stehen hast.

Kann dir momentan nicht wirklich weiter helfen, da nicht an meinem Hauptrechner bin. Probiere einfach mal aus.
Mitglied: 63130
63130 Oct 02, 2008 at 09:16:04 (UTC)
Goto Top
Also die ID stimmt schon:


Echo "<h1>Leistung erfassen</h1><br>  
<p>Bitte geben Sie eine Leistungsbeschreibung zu Ziffer ".$_GET[ziffer]." ein:<br></p>  
<input type=\"text\" id=\"beschreibung\" size=\"70\"><br><br>  
<input type=\"button\" value=\"Speichern\" onclick=\"saveDataAjax(".$_GET[ziffer].")\"> ";  

Wird eigentlich die ziffer auch gepostet oder muss ich die in einem Hidden-feld in dem Formular als id="ziffer" eingeben?
Member: dtzzzzzz
dtzzzzzz Oct 02, 2008 at 09:25:30 (UTC)
Goto Top
ach so, habe vergessen es zu sagen: du musst ja nicht die $_POST Variable abfragen, sondern die $_REQUEST, dann soll's wohl funktionieren. ;)
Mitglied: 63130
63130 Oct 02, 2008 at 09:35:17 (UTC)
Goto Top
Ok, dann probier ichs mal damit
Mitglied: 63130
63130 Oct 02, 2008 at 11:18:07 (UTC)
Goto Top
Also jetzt klappts fast. Nur bekommt die save_data.php mit $_REQUEST[ziffer] keine Ziffer. Wie kann ich machen dass er mir die Ziffer auch noch übergibt?
Member: dtzzzzzz
dtzzzzzz Oct 02, 2008 at 11:35:39 (UTC)
Goto Top
Ok, Max... Also ein bisschen musst du auch schon den Code dir anschauen... face-smile)

in der Function saveDataAjax

bei //Daten sammeln

kannst du noch eine Zeile einfügen:

data = data+'&ziffer='+zahl;

Dabei ist zahl die Zahl, die du ja an die Funktion auch übergibst.
Mitglied: 63130
63130 Oct 06, 2008 at 07:02:33 (UTC)
Goto Top
Aus irgendeinem Grund klappt das mit der Ziffer übergeben nicht.

function saveDataAjax(zahl){
	var data = '';  

	// Prüfen, ob alle Daten vorhanden sind
	if(self.document.getElementById('beschreibung') && zahl){  
	
		// Daten sammeln
		data = data+'&beschreibung='+self.document.getElementById('beschreibung').value;  
		data = data+'&ziffer='+self.document.getElementById('ziffer').value;  
	
		// Daten abschicken
		new Ajax.Request('save_data.php',			  
							{method:'post',  
							postBody: data,					
								onSuccess: function(input){
									// Wenn Daten erfolgreich gespeichert wurden
									alert('Daten wurden erfolgreich gespeichert.');  
									// Pop-Up-Fenster schliessen Funktion hier aufrufen!
									window.close();
								
								 },
								onFailure: function(input){
									// Wenn die Daten nicht gespeichert wurden	
									alert('FEHLER!');  
								}
							}
		);		
	}
}

<?PHP
	Include("include/db_connect.php");  
	
	$time = getdate();
	
	$goae = $_REQUEST[ziffer];
	$stand = $time[mday].".".$time[mon].".".$time[year];  
	$titel = $_REQUEST[beschreibung];
	
	$add = "INSERT INTO vc_goae (goae, stand, titel) VALUES ('$goae', '$stand', '$titel')";  
	mysql_query($add);
	
?>

Irgendeine Idee?


Und dann habe ich auch noch probleme, das "parent"fenster zu reloaden. Hier mal ein ausschnitt aus dem Quelltext wie ich es gerade probiere:

onSuccess: function(input){
   // Wenn Daten erfolgreich gespeichert wurden
      alert('Daten wurden erfolgreich gespeichert.');  
      // Pop-Up-Fenster schliessen Funktion hier aufrufen!
      window.opener.document.location.reload();
      window.close();
},

Ich weiß jetzt nich genau wie ich damit das Hauptfenster ansprechen kann. Du hast zwar schonmal gesagt, ich soll da ein wenig rum probieren aber das kam zu keinem Ergebnis :/
Member: dtzzzzzz
dtzzzzzz Oct 06, 2008 at 07:15:03 (UTC)
Goto Top
Ja, wieso fragst du Ziffer ab, wenn du im HTML zahl übergibst? face-smile

Du übergibst an die JavaScript -Funktion die Variable zahl: function saveDataAjax(zahl)

In der Funktion übergibst du aber:
data+'&ziffer='+self.document.getElementById('ziffer').value;

Diese ist ja nicht im HTML-Formular vorhanden, weil auch nicht nötig.

Also es muss entweder so aussehen:
data+'&ziffer='+zahl;

dann brauchst du nur die JavaScript-Datei zu ändern,

ODER:
data+'&zahl='+zahl;
dann musst du aber auch noch die Variable in sava_data.php abändern.
Mitglied: 63130
63130 Oct 06, 2008 at 07:21:55 (UTC)
Goto Top
Ich hab jetzt in der JavaScriptdatei
data+'&ziffer='+zahl;  
eingesetzt. Aber ich bekomme immernoch keine Ziffer in der save_data.php
Member: dtzzzzzz
dtzzzzzz Oct 06, 2008 at 07:35:57 (UTC)
Goto Top
Ok, poste bitte noch ein Mal deinen relevanten Code komplett hier rein. ;)
Mitglied: 63130
63130 Oct 06, 2008 at 07:51:01 (UTC)
Goto Top
Das hier ist die maske.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
"http://www.w3.org/TR/html4/loose.dtd">  
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
<meta name="language" content="de">  
<style type=\"text/css\">  

body {
 background-color: #fff;
 margin: 40px;
 font-family: Lucida Grande, Verdana, Sans-serif;
 font-size: 14px;
 color: #4F5155;
}

a {
 color: #003399;
 background-color: transparent;
 font-weight: normal;
}

h1 {
 color: #444;
 background-color: transparent;
 border-bottom: 1px solid #D0D0D0;
 font-size: 16px;
 font-weight: bold;
 margin: 24px 0 2px 0;
 padding: 5px 0 6px 0;
}

code {
 font-family: courier, Monaco, Verdana, Sans-serif;
 font-size: 10px;
 background-color: #f9f9f9;
 border: 1px solid #D0D0D0;
 color: #002166;
 display: block;
 margin: 14px 0 14px 0;
 padding: 12px 10px 12px 10px;
}

h4 {
 font-family: Lucida Grande, Verdana, Sans-serif;
 font-size: 10px;
 color: #4F5155;
}

h2 {
 background-color: #fff;
 font-size: 14px;
 font-family: Lucida Grande, Verdana, Sans-serif;
 text-align: right;
}

</style>
<title>Leistung erfassen</title>

<script type="text/JavaScript" src="javascript/prototype.js"></script>  
<script type="text/JavaScript" src="javascript/functions.js"></script>  

<body>

<?php

Echo "<h1>Leistung erfassen</h1><br>  
<p>Bitte geben Sie eine Leistungsbeschreibung zu Ziffer ".$_GET[ziffer]." ein:<br></p>  
<input type=\"text\" id=\"beschreibung\" size=\"70\"><input type=\"hidden\" id=\"ziffer\" value=\"$_GET[ziffer]\"><br><br>  
<input type=\"button\" value=\"Speichern\" onclick=\"saveDataAjax(".$_GET[ziffer].")\"> ";  

?>
</body>
</html>

Das hier ist die functions.js:

function saveDataAjax(zahl){
	var data = '';  

	// Prüfen, ob alle Daten vorhanden sind
	if(self.document.getElementById('beschreibung') && zahl){  
	
		// Daten sammeln
		data = data+'&beschreibung='+self.document.getElementById('beschreibung').value;  
		data+'&ziffer='+zahl;  
	
		// Daten abschicken
		new Ajax.Request('save_data.php',			  
							{method:'post',  
							postBody: data,					
								onSuccess: function(input){
									// Wenn Daten erfolgreich gespeichert wurden
									alert('Daten wurden erfolgreich gespeichert.');  
									// Pop-Up-Fenster schliessen Funktion hier aufrufen!
									window.opener.document.location.reload();
									window.close();
								
								 },
								onFailure: function(input){
									// Wenn die Daten nicht gespeichert wurden	
									alert('FEHLER!');  
								}
							}
		);		
	}
}

Und das hier ist die save_data.php:

<?PHP
	Include("include/db_connect.php");  
	
	$time = getdate();
	
	$goae = $_REQUEST[ziffer];
	$stand = $time[mday].".".$time[mon].".".$time[year];  
	$titel = $_REQUEST[beschreibung];
	
	$add = "INSERT INTO vc_goae (goae, stand, titel) VALUES ('$goae', '$stand', '$titel')";  
	mysql_query($add);
	
?>

Die benötigte Ziffer kommt in der Variable $_GET[ziffer] in der maske.html an
Member: dtzzzzzz
dtzzzzzz Oct 06, 2008 at 08:53:01 (UTC)
Goto Top
Die Zeile: data+'&ziffer='+zahl; ist falsch.
Es muss heißen:

data=data+'&ziffer='+zahl;

Außerdem würde ich immer bei $_REQUEST die Namen in den Klammern in ' ' schreiben:
$goae = $_REQUEST['ziffer']; Außerdem würde ich sie z. B. auch gleich auf den richtigen Format bringen: z. b.
$goae = intval($_REQUEST['ziffer']);

Um, rauszubekommen, ob die Daten von AJAX / bzw. JavaScript übergeben werden, nutze am Besten Firebug und zumindest alert - Funktion. Somit kannst du zumindest mit alert(data); sehen, welche Variablen und welche Werte übergeben werden.
Mitglied: 63130
63130 Oct 07, 2008 at 08:07:06 (UTC)
Goto Top
Juchu es funktioniert face-smile

Vielen Dank face-smile


Jetzt hab ich nur noch eine Kleinigkeit: Wenn der im Hauptfenster den Reload macht dann fragt er mich immer "Daten erneut senden?", kann ich das irgendwie umgehen?
Mitglied: 63130
63130 Oct 09, 2008 at 09:23:00 (UTC)
Goto Top
Ok da komme ich scheinbar nicht drum herum.

Vielen Dank für die viele Hilfe! face-smile

Der Beitrag ist damit dann gelöst

Viele Grüße,
Max aka v3rtico