MB: Einträge mit PHP Factory Pattern

moin,

ih bin dabei kleine posts alla Factory Pattern aus zugeben. Ich habe hier code schnippsel einer html datei ohne suffix abgespeichert.

<table>
  <tbody>
    <tr><td>Hallo <?php echo $name ?>!</td></tr>
  </tbody>
</table>
  • ich habe ihn mit file_get_contents() geladen. Klappt gut da wo ich ihn haben will nur der Parameter $name will die Funktion nicht um wandeln. Wahrscheinlich weils eben n kompletter geladener string ist inklusive PHP.
  • ich hab ihn mit include() probiert. klappt super nur eben an einer falschen stelle.

Ich möchte daten aus einem Array in html tabelle einbetten. Ich kann die ganze html tabelle runtime in php erzeugen und escapen. Ich will aber html und php so gut es geht trinnen.

das möchte ich nicht tun, ist umständlich klappt aber.

<?php
echo "<table>
  <tbody>
    <tr><td>Hallo $name !</td></tr>
  </tbody>
</table>";
?>

wie machen das die ganz großen seiten? Wie macht ihr das?

vlg MB

  1. Wie macht ihr das?

    Code und Template sauber trennen:

    $self->{STASH}{adressen} = $DBH->selectall_arrayref(q(
       select 
         name,
         vname,
         ort
       from
         adressen
       where
         ort = 'Gotha'
    ), { Slice => {} });
    
    %loop_adressen%
    <tr>
      <td> %name%  </td>
      <td> %vname% </td>
      <td> %ort%   </td>
    </tr>
    %endloop%
    

    und damit das was mit einer Factory zu tun haben soll, wird die DBHandler--Methode $DBH->selectall_arrayref() zu einer eigenen Methode gemacht und nicht über den Handler $DBH aufgerufen sondern über die eigene Instanz $self->adressen_from('Gotha');

    Erst in der im Sinne eine Factory ausgelagerten Methode wird die DBI-Library geladen und das DBHandle erstellt.

    1. moin pl,

      ich kenne mich in perl _NICHT_aus und es ist für mich verwirrend verschidener beiträge script sprachen zu mischen. Ich denke arber du räts mir exakt das gleiche wie dedlfix nur in der programmier sprache die ich verstehe. In diiesem Disesm Sinne Vielen lieben Dank für den Rat :-).

      vlg MB

  2. Tach!

    <table>
      <tbody>
        <tr><td>Hallo <?php echo $name ?>!</td></tr>
      </tbody>
    </table>
    
    • ich habe ihn mit file_get_contents() geladen. Klappt gut da wo ich ihn haben will nur der Parameter $name will die Funktion nicht um wandeln. Wahrscheinlich weils eben n kompletter geladener string ist inklusive PHP.

    file_get_contents() liefert Inhalt, ohne ihn zu interpretieren. Deshalb landet sogar das ganze Konstrukt <?php echo $name ?>in der Ausgabe.

    • ich hab ihn mit include() probiert. klappt super nur eben an einer falschen stelle.

    Ja, das interpretiert Code, aber an Ort und Stelle des Aufrufs. Output Buffering wäre eine Möglichkeit, den erzeugten Text aufzufangen. Aber lies lieber weiter.

    Ich möchte daten aus einem Array in html tabelle einbetten. Ich kann die ganze html tabelle runtime in php erzeugen und escapen. Ich will aber html und php so gut es geht trinnen.

    Es ist nicht besonders sinnvoll, ohne ausreichende Begründung (spezielles Tooling zum Beispiel) HTML und PHP strikt getrennt zu halten. Man benötigt auch beim Erzeugen der Ausgabe eine Form von Logik (Schleifen, Bedingungen, Maskierungen). Wenn du PHP und HTML nicht mischen möchtest, musst du einen Ersatz für PHP nehmen und dann hast du Ersatz und HTML gemischt. Das führt nur vom Regen in die Traufe. Für dieses Problem gibt es keine Lösung, bei der alle Teile 100% voneinander getrennt und nicht "verunreinigt" werden. Ein erwägbares Argument kann aber sein, dass es sich mit $ersatz einfacher arbeiten lässt als mit PHP. Nun, wenn du das für den Fall so entscheidest, dann sei es so.

    <?php
    echo "<table>
      <tbody>
        <tr><td>Hallo $name !</td></tr>
      </tbody>
    </table>";
    ?>
    

    wie machen das die ganz großen seiten? Wie macht ihr das?

    Man kann ja nur irgendein Template-System nehmen, sei es ein selbstgestricktes oder ein vorhandenes externes oder PHP selbst. So wie dein erster Ansatz ist es nicht verkehrt. Nur an der richtigen Stelle muss es passieren. Du kennst doch das MVC-Pattern. Ob du ein solches Framework einsetzt oder nicht, ist egal, aber das Prinzip kannst du ja in ähnlicher Weise verwenden. Alternativ geht auch das ganz simple EAV-Prinzip (Eingabe - Verarbeitung - Ausgabe). Der Controller (oder V-Teil) sammelt alle Daten ein und übergibt sie am Ende der View (oder dem A-Teil). Dort werden sie dann mit den statischen Teilen zusammengefügt. Dabei darf PHP gern helfen. Ob die View nun das Template als String bekommt oder den Namen der Template-Datei und es sich selbst lädt, ist dabei Gemschmackssache.

    Damit hast du eine ordentliche Trennung - nach Zuständigkeiten, nicht nach dem Werkzeug.

    dedlfix.

    1. moin dedlfix,

      So wie dein erster Ansatz ist es nicht verkehrt. Nur an der richtigen Stelle muss es passieren.

      Das ist ja das problem :/

      Alternativ geht auch das ganz simple EAV-Prinzip (Eingabe - Verarbeitung - Ausgabe). Der Controller (oder V-Teil) sammelt alle Daten ein und übergibt sie am Ende der View (oder dem A-Teil). Dort werden sie dann mit den statischen Teilen zusammengefügt.

      geht auch aber ist das n bisschen statisch da ich verschachteln will ist das als leihe meines erarchtens nicht snnvoll

      Dabei darf PHP gern helfen. Ob die View nun das Template als String bekommt oder den Namen der Template-Datei und es sich selbst lädt, ist dabei Gemschmackssache.

      Ok hat mir denke ich pl geraten. In diesem Sinne auch dir herzlichen Dank.

      vlg MB

      1. Tach!

        Alternativ geht auch das ganz simple EAV-Prinzip (Eingabe - Verarbeitung - Ausgabe). Der Controller (oder V-Teil) sammelt alle Daten ein und übergibt sie am Ende der View (oder dem A-Teil). Dort werden sie dann mit den statischen Teilen zusammengefügt.

        geht auch aber ist das n bisschen statisch da ich verschachteln will ist das als leihe meines erarchtens nicht snnvoll

        Ohne Satzzeichen ist der Satz schwer verständlich.

        Mit den statischen Teilen des Templates meinte ich, den HTML-Code, zwischen dem sich die variablen Teile befinden, sei es als PHP-Code oder in einer anderen Template-Sprache.

        Ich kann dir momentan keine genauere Vorgehensweise vorschlagen, weil ich nicht weiß, welches deine Aufgabenstellung ist, die du zu lösen versuchst.

        Wenn es darum geht, dass verschiedene Teile der Seite von verschiedenen Komponenten erstellt werden, dann kannst du das MVC/EAV-Prinzip auch im Großen wie im Kleinen anwenden. Der Controller für das Hauptgerüst beauftragt die Controller der einzelnen Teile mit dem Liefern ihrer speziellen gerenderten Views und baut deren Ergebnisse in sein eigenes Template ein, beispielsweise.

        dedlfix.

        1. Hi dedlfix,

          Ohne Satzzeichen ist der Satz schwer verständlich.

          ups, sorry

          Wenn es darum geht, dass verschiedene Teile der Seite von verschiedenen Komponenten erstellt werden, dann kannst du das MVC/EAV-Prinzip auch im Großen wie im Kleinen anwenden.

          habe ich auch auf der seite von pl gelesen. Werde mich näher damit befassen. guter tipp von euch.

          Der Controller für das Hauptgerüst beauftragt die Controller der einzelnen Teile mit dem Liefern ihrer speziellen gerenderten Views und baut deren Ergebnisse in sein eigenes Template ein, beispielsweise.

          Das ist mein ziel :-).

          vlg MB