Rolf B: Radiobuttons vorbelegen

Beitrag lesen

Hallo Felix,

das Ding anzupassen dürfte schon anspruchsvoll sein, und es wirft das aktuelle Design der Seite über den Haufen. Es setzt voraus, dass man ein PHP Script schreibt, dass ein vollständiges DOMDokument Objekt aufbaut und ausgibt, statt - wie in PHP eher üblich - das HTML selbst Schritt für Schritt auszugeben. Braucht eine Template-Sprache ein Template-System? Häufiger Diskussionspunkt in PHP.

Ich weiß auch nicht, wie exakt man mit DOMDocument das generierte HTML beeinflussen kann, vor allem, wenn Scripte oder anderes dazu kommen. Hast Du da Erfahrungen?

Der Artikel macht es einem auch nicht leicht, die dargestellten Informationen richtig einzuordnen. Der Abschnitt "Formularinhalte vorbelegen" hat mit der Metavariablen-Ersetzung inhaltlich nichts zu tun, bezieht aber Techniken aus dem vorigen Abschnitt "Metavariablen" mit ein, ohne das ausdrücklich zu benennen

Sodann scheint mir, als wäre der Artikel überarbeitungswürdig. Ich habe ihn nicht vollständig gelesen, sondern nur erstmal die beiden jetzt angesprochenen Teile angeschaut.

(1) move_nodes. Fehlt da im backwards-Modus nicht das ->importNode? Und wieso wird ein "backwards" Modus verwendet, wenn es doch eigentlich darum geht, die Kinder von $from entweder als Geschwister vor $to zu setzen (insertBefore) oder an die Kinder von $to anzuhängen (appendChild). API und Arbeitsweise dieser Funktion scheinen mir sehr suspekt.

(2) preselect_form_values. Ein Monster, das "zerlege mich" schreit, und das sehr ungeschickt nach seinen Daten sucht. Warum so:

function preselect_form_values ($node, $data) {
  foreach ($node->getElementsByTagName('*') as $n) {

    if ($n->hasAttribute('name')) {

      foreach (array_keys($data) as $key) {

        if ($n->getAttribute('name') === $key) {

          switch ($n->tagName) {
            ... 
          }
        }
      }
    }
  }
}

In $data kann es maximal einen Key mit dem Namen des Node geben. Wieso dann die Keys sequenziell durchlaufen? isset reicht völlig. Eine hasAttribute-Abfrage auf dem DOM Node ist auch überflüssig. getAttribute liefert einen Leerstring, wenn das Attribut nicht existiert. Bei mir sähe das - wenn überhaupt - so aus:

function preselect_form_values ($formNode, $data) {
  foreach ($formNode->getElementsByTagName('*') as $elementNode) {
    $name = $elementNode->getAttribute('name');
    if ($name && isset($data[$name])
       preselect_form_element($elementNode, $data[$name]);
  }
}

Und der eigentlich Job wird ausgelagert. Lies: Robert Martin, Clean Code.

function preselect_form_element($elementNode, $value) {
   switch ($elementNode->tagName) {
      case "input":
         switch ($elementNode->getAttribute("type")) {
            case "text": 
               return preselect_form_input_text($elementNode, $value);
            case "number": 
               return preselect_form_input_number($elementNode, $value);
            case "checkbox": 
               return preselect_form_input_checkbox($elementNode, $value);
            case "radio": 
               return preselect_form_input_radio($elementNode, $value);
         }
         break;
      }
      case "textarea":
         return preselect_form_textarea($elementNode, $value);
      case "select":
         return preselect_form_select($elementNode, $value);
   }
}

Am besten passt das in eine Mapper-Klasse.

Rolf

--
sumpsi - posui - obstruxi