Naps: Menschelei: HTML in PHP / PHP in HTML

Hi,

jedes mal wenn ich vor dem "Problem" stehe, bin ich mit dem Ergebnis nicht wirklich zufrieden.
Um ein ganz kleines Beispiel zu nennen:

<select>  
    <option value="1">1</option>  
    <option value="2">2</option>  
    <option value="3">3</option>  
    <option value="4">4</option>  
    <option value="5">5</option>  
</select>

Wenn ich die selektierte Option anzeigen will:

<select>  
    <option value="1" <?php echo ($option == 1) ? 'selected': '';?>>1</option>  
    <option value="2" <?php echo ($option == 2) ? 'selected': '';?>>2</option>  
    <option value="3" <?php echo ($option == 3) ? 'selected': '';?>>3</option>  
    <option value="4" <?php echo ($option == 4) ? 'selected': '';?>>4</option>  
    <option value="5" <?php echo ($option == 5) ? 'selected': '';?>>5</option>  
</select>

Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?

MfG Naps

  1. Hallo,

    Wie kann man so etwas anders umsetzen?

    Befasse dich mit Schleifen.

    Gruß
    Kalk

  2. Hello,

    jedes mal wenn ich vor dem "Problem" stehe, bin ich mit dem Ergebnis nicht wirklich zufrieden.
    Um ein ganz kleines Beispiel zu nennen:

    <select>

    <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>

    
    >   
    > Wenn ich die selektierte Option anzeigen will:  
    >   
    > ~~~html
    
    <select>  
    
    >     <option value="1" <?php echo ($option == 1) ? 'selected': '';?>>1</option>  
    >     <option value="2" <?php echo ($option == 2) ? 'selected': '';?>>2</option>  
    >     <option value="3" <?php echo ($option == 3) ? 'selected': '';?>>3</option>  
    >     <option value="4" <?php echo ($option == 4) ? 'selected': '';?>>4</option>  
    >     <option value="5" <?php echo ($option == 5) ? 'selected': '';?>>5</option>  
    > </select>
    
    

    Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?

    Kannst ja mal in meiner Vergangenheit kramem.
    http://forum.de.selfhtml.org/archiv/2007/4/t150060/#m974901

    Da gab es Funktionen mit Durchgriff bis auf die Datenbank.
    Ist auch nicht hübsch, aber vielleicht regt es Dich noch zum neuen Nachdenken an?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com
  3. Hallo!

    Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?

    • Indem man sich nicht wiederholt (Don’t repeat yourself – DRY), sondern eine for-Schleife benutzt, um die option-Elemente zu erzeugen. Grundlage kann eine Datenstruktur, z.B. ein Array mit (assoziativen) Arrays sein. Oder die Schleife zählt einfach Zahlen hoch. Dabei entsteht meist ein HTML-String, den man dann ausgibt.
    $selected = 5;  
    $html = '';  
    for ($i = 1; $i <= 5; $i++) {  
      $html .= '<option value="' . $i . '"' . ($i == $selected ? ' selected' : '') . '>' . $i . "</option>\n";  
    }  
    echo $html;
    

    Disclaimer: Ich kann kein PHP. Ungetesteter beispielhafter Code.

    • Mit Templating-Sprachen, die das Notieren von Wiederholungen vereinfachen. Sie sorgen auch für das korrekte Escaping von Werten. Ist nicht so hässlich wie das händische Zusammenbauen von Strings (siehe oben).

    • Mit objektorientierter Programmierung. Mit Formular-Widget-Klassen, die eine Datenstruktur entgegennehmen und das entsprechende HTML rendern. PHP-Webframeworks bringen sowas mit sich.

    Grüße
    Mathias

      • Indem man sich nicht wiederholt (Don’t repeat yourself – DRY)

      Und das wiederholts du gleich auf 3 Sprachen/Schreibweisen? :D

      1. Hi,

        • Indem man sich nicht wiederholt (Don’t repeat yourself – DRY)

        Und das wiederholts du gleich auf 3 Sprachen/Schreibweisen? :D

        Hat es bestimmte Gründe, daß Du die Zitatzeichen kaputtmachst? (ist mir auch schon in anderen Posts von Dir aufgefallen ...)

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          • Indem man sich nicht wiederholt (Don’t repeat yourself – DRY)

          Und das wiederholts du gleich auf 3 Sprachen/Schreibweisen? :D

          Hat es bestimmte Gründe, daß Du die Zitatzeichen kaputtmachst? (ist mir auch schon in anderen Posts von Dir aufgefallen ...)

          Nein, jetzt wo du es sagst:

          ich hatte einige Beiträge ohne /my/ verfasst, dann kopiert, mich angemeldet und wieder eingefügt.

          Für nicht angemeldete Benutzer ist das Zitatzeichen scheinbar > während mein persönliches »» ist.

  4. Liebe(r) Naps,

    in meinen Projekten stehen solche Dinge nicht in einer Template-Datei, sondern werden per Schleife eingefügt. Dazu nutze ich in der Regel diesen Ansatz:

    <form ...>  
        <p>  
            <select name="Schluessel">  
            </select>  
        </p>  
    ...  
    </form>
    

    Der obige HTML-Code steht in einer HTML-Datei, welche als Vorlage geladen wird. Die <option>-Elemente werden nun in einer Schleife erzeugt und eingebunden:

    $html = file_get_contents('./meine/template/datei.html');  
      
    $options = '';  
      
    foreach ($meine_daten as $key => $value) {  
        $options .= sprintf(  
            "\t\t\t".'<option value="%1$s">%2$s</option>'."\r\n",  
            htmlspecialchars($key),  
            htmlspecialchars($value)  
        );  
    }  
      
    $html = preg_replace(  
        '~(?is)(<select[^>]*name="Schluessel"[^>]*>[\r\n]*)~',  
        '$1'.$options,  
        $html  
    );
    

    Hilft Dir das als Anregung weiter?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. in meinen Projekten stehen solche Dinge nicht in einer Template-Datei, sondern werden per Schleife eingefügt. Dazu nutze ich in der Regel diesen Ansatz:

      <form ...>

      <p>
              <select name="Schluessel">
              </select>
          </p>
      ...
      </form>

      
      >   
      > Der obige HTML-Code steht in einer HTML-Datei, welche als Vorlage geladen wird. Die <option>-Elemente werden nun in einer Schleife erzeugt und eingebunden:  
      >   
      > ~~~php
      
      $html = file_get_contents('./meine/template/datei.html');  
      
      >   
      > $options = '';  
      >   
      > foreach ($meine_daten as $key => $value) {  
      >     $options .= sprintf(  
      >         "\t\t\t".'<option value="%1$s">%2$s</option>'."\r\n",  
      >         htmlspecialchars($key),  
      >         htmlspecialchars($value)  
      >     );  
      > }  
      >   
      > $html = preg_replace(  
      >     '~(?is)(<select[^>]*name="Schluessel"[^>]*>[\r\n]*)~',  
      >     '$1'.$options,  
      >     $html  
      > );
      
      

      Hilft Dir das als Anregung weiter?

      Ja das war eigentlich genau das, was ich meinte.

      Aber würdest du das so auch bei größeren / komplexeren Sachen verwenden?
      Ich habe schon oft versucht, zu erfahren wie andere das machen aber bekomme von den meisten einfach nur die Antwort "verwende eine Template-Engine".

      Wenn ich das ganze jetzt komplett objektorientiert angehe, und eine Klasse verwende, die mir das Formular erstellt, schaut es nachher meistens noch "hässlicher". Bei 0815 Formularen lasse ich mir das einreden, aber wenn das Formular etwas komplexer aufgebaut ist habe ich noch nie eine Klasse gesehen die das vernünftig lösen kann.

      MfG Naps

      1. Hallo,

        Ich habe schon oft versucht, zu erfahren wie andere das machen aber bekomme von den meisten einfach nur die Antwort "verwende eine Template-Engine".

        Und was ist an der Antwort schlecht?

        Wenn ich das ganze jetzt komplett objektorientiert angehe, und eine Klasse verwende, die mir das Formular erstellt, schaut es nachher meistens noch "hässlicher". Bei 0815 Formularen lasse ich mir das einreden, aber wenn das Formular etwas komplexer aufgebaut ist habe ich noch nie eine Klasse gesehen die das vernünftig lösen kann.

        Hässlichen Low-Level-Code, der HTML-Code durch Stringverkettung zusammenbaut, in eine Klasse zu packen macht ihn nicht schöner.  Das ist nicht Sinn der Sache.  Der Sinn ist Abstraktion.

        HTML programmatisch zusammenzubauen ist nie schön. Webframeworks bringen grundlegende Helfer mit, damit diese Klassen möglichst lesbar sind. Sie arbeiten nicht direkt auf Stringebene, sondern auf Element- und Attributebene oder sogar auf DOM-Ebene. Dadurch werden die Logiken nicht simpler, aber der Code sauberer. Durch die Separation of Concerns hat man z.B. nicht ständig mit dem Escapen von Daten zu tun. Das passiert automatisch auf einer Ebene darunter.

        Einige Templating-Sprachen sind XML-basiert und somit ggf. durch XSL transformierbar. Sie erlauben es, Markup deklarativ zu erzeugen und andere Komponenten mit einfachen Elementen einzubinden. Über Expressions werden die Daten eingebunden.

        Mathias

  5. Mahlzeit,

    Dass das "hässlich" ist, weiß ich. Wie kann man so etwas anders umsetzen?

    Wenn es eine grössere Anwendung ist, solltest du dir mal ne Template-Engine wie Smarty ansehen.

    --
    42