XML-Daten per PHP editieren

matthiasschnueriger

Erfahrenes Mitglied
Ich mal wieder...

Idee: Bestehende XML-Datensätze in einem HTML-Formular anzeigen, bearbeiten und wieder abspeichern.

Meine XML-Struktur:
HTML:
<rezeptdaten>
 <rezept>
  <datei>xy.jpg</datei>
  <hauptkomponente>Dunkle Grundmasse</hauptkomponente>
  <nebenkomponente1>Haselnuss</nebenkomponente1>
  <nebenkomponente2>Blaubeeren</nebenkomponente2>
 </rezept>
 <rezept>
  <datei>abc.jpg</datei>
  <hauptkomponente>Helle Grundmasse</hauptkomponente>
  <nebenkomponente1>Walnuss</nebenkomponente1>
  <nebenkomponente2>Heidelbeeren</nebenkomponente2>
  <nebenkomponente3>Butter</nebenkomponente3>
  <nebenkomponente4>Schokolade</nebenkomponente4>
 </rezept>
</rezeptdaten>

Dabei gibt es für das Tag <hauptkomponente> nur 2 Möglichkeiten und zwar "Dunkle Grundmasse" und "Helle Grundmasse". Dies soll über ein Radio-Button ausgewählt werden können.
Die <nebenkomponenten> sollen über eine Checkbox bearbeitet werden können.

Aktueller Stand: Scheinbar hat das schon mal jemand versucht (Link), deshalb habe ich mit diesem Code gestartet und versucht für mein XML-File anzupassen. Leider funktioniert es nicht ganz, die Verknüpfung zu meinem XML scheint zu klappen, allerdings wird der Datensatz nicht richtig bearbeitet.

Der Dateiname soll nicht editierbar sein, deshalb wird dieser ganz normal und ohne Textfeld ausgegeben.

Wie krieg ich es jetzt hin, dass der richtige Radio-Button und die richtigen Checkboxen (gemäss XML-Informationen) ausgewählt sind und ich diese aber ändern kann?


Mein PHP-Code (inkl. HTML Formular):
PHP:
   <?php
$file = "rezeptdaten.xml"; // Pfad zur Quelldatei
$xml = simplexml_load_file($file);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>XML-Editor</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>

<body>
<?php
if (empty($_POST)) {
?>
<form action="<? echo $_SERVER['PHP_SELF']?>" method="post">
<?php
foreach ($xml as $node) {
$i++;
$hauptkomponente = $node->hauptkomponente;
$nebenkomponente = $node->nebenkomponente;

//
echo '<hr size="1"><b>'.(string)$node->datei.'</b><br>'; // Gibt den Dateinamen aus, kann nicht bearbeitet werden

echo "<input name=\"hauptkomponente_$i\" type=\"radio\" value=\"$hauptkomponente\" /> Grundmasse 1 <br>"; // Radio-Button 1
echo "<input name=\"hauptkomponente_$i\" type=\"radio\" value=\"$hauptkomponente\" /> Grundmasse 2 <br>"; // Radio Button 2
echo "<input name=\"nebenkomponente_$i\" type=\"checkbox\" value=\"$nebenkomponente\" /> Haselnuss<br>"; //Checkbox
echo "<input name=\"nebenkomponente_$i\" type=\"checkbox\" value=\"$nebenkomponente\" /> Walnuss<br>"; //Checkbox
echo "<input name=\"nebenkomponente_$i\" type=\"checkbox\" value=\"$nebenkomponente\" /> Baumnuss<br>"; //Checkbox
echo "<input name=\"nebenkomponente_$i\" type=\"checkbox\" value=\"$nebenkomponente\" /> Blaubeeren<br>"; //Checkbox
echo "<input name=\"nebenkomponente_$i\" type=\"checkbox\" value=\"$nebenkomponente\" /> Heidelbeeren<br>"; //Checkbox
echo "<input name=\"nebenkomponente_$i\" type=\"checkbox\" value=\"$nebenkomponente\" /> Brombeeren<br>"; //Checkbox

}
?>
<input type="submit" name="Submit" value="Speichern" />
</form>
</body>
</html>
<?php
} else {
foreach ($_POST as $key => $value) {
if($key != "Submit") {
$para = explode("_", $key);
$nr = $para[1];
$hauptkomponente = $para[0];
$xml->rezept[$nr-1]->$hauptkomponente = $value;
$xml->asXML($file);
}
}
echo "Datei gespeichert!\n";
echo "</body>\n";
echo "</html>";
}
?> 

</body>
</html>
 
Hallo Leute

Scheinbar kann mir hier niemand wirklich weiterhelfen... :-( Ist meine Fragestellung unklar? Oder ist dieses PHP-Script einfach zu unverständlich (was ich verstehen könnte, da ich da auch nicht wirklich durchblick ;-)).

Was ich jetzt geschafft habe, ist mit einer if-Schlaufe den richtigen der beiden Radio-Buttons zu aktivieren. Allerdings wird eine entsprechende Änderung nicht im XML-File gespeichert, obwohl das Script ausgibt "Änderungen gespeichert" (Problem 1).

PHP:
echo "<input name=\"hauptkomponente_$i\" type=\"radio\" value=\"$hauptkomponente\""; // Radio-Button 1 (Teil 1)

if ($hauptkomponente=="Dunkle Grundmasse") {
	$dunkelaktiv = " checked";
	} else { 
	$hellaktiv =" checked";
	}

echo "$dunkelaktiv /> Grundmasse 1 <br>"; // Radio-Button 1 (Teil 2)
echo "<input name=\"hauptkomponente_$i\" type=\"radio\" value=\"$hauptkomponente\" $hellaktiv /> Grundmasse 2 <br>"; // Radio Button 2

Und wie mach ich das jetzt mit den Checkboxen, denn die Begriffe im XML unter <nebenkomponente1>, <nebenkomponente2> etc. sind ja z.B. nicht immer dieselben. D.h. mein Datensatz könnte mal so aussehen:

HTML:
...
<nebenkomponente1>Haselnuss</nebenkomponente1>
<nebenkomponente2>Brombeeren</nebennkomponente2>
...

und mal so...
HTML:
...
<nebenkomponente1>Brombeeren</nebenkomponente1>
<nebenkomponente2>Blaubeeren</nebennkomponente2>
...

Wäre euch wirklich dankbar über Inputs/Hilfeleistungen!
 
Hallo Leute

Scheinbar kann mir hier niemand wirklich weiterhelfen... Ist meine Fragestellung unklar? Oder ist dieses PHP-Script einfach zu unverständlich (was ich verstehen könnte, da ich da auch nicht wirklich durchblick ).

Ich glaube die Fragestellung ist soweit schon klar. Der zweite angesprochene Punkt trifft es da schon eher, obwohl es wohl weniger an der unverständlichkeit des Scripts liegt, als vielmehr an der Masse an Fehlern, die in diesem Script auftauchen.

Mal als Beispiel:

PHP:
$nebenkomponente = $node->nebenkomponente;

Ich kann mit kaum vorstellen, dass das funktioniert, aus dem ganz einfachen Grund, es gibt in deinem xml überhaupt keinen Knoten der nebenkomponente heißt.
Es wäre wahrscheinlich sowieso besser, dein xml ein wenig zu verändern.
Anstatt der knoten nebenkomponente1, nebenkomponente2 usw. würde ich es eher folgendermaßen machen:

HTML:
<nebenkomponenten>
 <nebenkomponente>Haselnuss</nebenkomponente>
 <nebenkomponente>Schokolade</nebenkomponente>
</nebenkomponenten>

so werden dir dann die ganzen nebenkomponenten gleich schön in einem array geliefert und brauchst für die ausgabe einfach eine schleife drüber laufen zu lassen.
 
Zurück