Rolf B: HTML 1 Formular für EDIT und CREATE

Beitrag lesen

Hallo Mitleser,

im CREATE sind die input-Felder alle leer (value="")

Nicht wirklich gut: es sollten die Defaults drinstehen

Das ist jetzt Sache des Formulars und der Anforderungen, ob man Defaults in den Feldern stehen haben will.

Aber, "Neuling", wenn Du doch das Edit-Formular aus einer $Datensatz Variablen befüllst, dann kannst du einfach einen leeren $Datensatz erzeugen und dein EDIT Formular ausgeben. Fertig ist das Erfassungsformular. Möglicherweise geht das nicht immer. Wo kommt dein $Datensatz-Objekt denn her? Ist das eine Klasse von Dir? Oder ist das ein Standardobjekt, das Du von mysqli mit fetch_object geholt hast? Kein Ding, sowas legst Du leer mit $Datensatz = new stdClass; an.

Und dann ist deine Idee, die Du angerissen hast, völlig okay. Man kommt gelegentlich gar nicht drum herum, für CREATE und EDIT unterschiedliche Zweige zu durchlaufen. Solange es aber so aussieht wie bei Dir, geht es kompakter. Das $isEdit Flag, das ich vorneweg setze, soll Platz sparen, gerade hier im Forum ist das nützlich. Du kannst natürlich auch überall ($MODUS=="EDIT") hinschreiben.

$isEdit = ($MODUS == "EDIT");

<input name="feld1" 
       value="<?= $isEdit ? htmlspecialchars($Datensatz->Wert1) : "" ?>">
<input name="feld2"
       value="<?= $isEdit ? htmlspecialchars($Datensatz->Wert2) : "" ?>">
<input name="feld3" 
       value="<?= $isEdit ? htmlspecialchars($Datensatz->Wert3) : "" ?>">

Das ist natürlich unvollständig, Input-Elemente brauchen auch Labels. Bei Radiobuttons oder Checkboxen musst Du passend zum Datensatzwert das checked-Attribut setzen, da ist es etwas umständlicher

Der Unterschied zu deinem Ansatz ist nur die Schreibarbeit, nicht die Idee an sich:

  • Das Markup für das input Element steht nur einmal da, die Abfragelogik ist nur im Value-Attribut
  • <?= ... ?>, das ist die Abkürzung für <?php echo ...; ?>
  • Ich verwende den ternären Bedingungsoperator ?:. „ternär“ ist analog zu „binär“ zu sehen und heißt einfach: Operator mit drei Operanden. Man schreibt bedingung ? then-wert : else-wert. Wie die Vorrangtabelle zeigt, hat ?: eine sehr tiefe Priorität, du musst also die drei Operanden normalerweise nicht klammern.

Die Information, ob und was Du editierst muss das Form aber auch haben. Das kannst Du im Submit-Button codieren.

   <button type="submit"
           name="save"
           value="<?= $isEdit ? $Datensatz->ID : "create" ?>">
      Speichern
   </button>

Die ID habe ich hier nicht maskiert. Ob Du das musst, hängt davon ab, welche Werte die annehmen kann.

Wichtig ist, dass Du die ID (oder create) auch in der Session speicherst. Wenn die Antwort vom Anwender kommt, musst Du die ID mit der geposteten ID vergleichen. Nur wenn die gleich sind, darfst Du die Antwort akzeptieren.

Problem sind dann Anwender, die mehrere Browsertabs mit deiner Seite aufhaben und in zwei Fenstern editieren. Je nachdem, wie das Tab geöffnet wurde, ist der Sessioncookie gleich. Bei denen geht dann ein Edit schief, aber denen muss man dann erklären, dass diese Arbeitsweise nicht unterstützt wird.

Rolf

--
sumpsi - posui - obstruxi