Thomas: Vorlagensystem in PHP

Hallo!

Ich habe ein gewaltiges Entscheidungsproblem bzgl. eines Vorlagensystems für meine Homepage.

Mir gefällt das Vorlagensystem mit objekt-orientierter Programierung mittels Klassen sehr gut, aber... ich bin dabei zu sehr gebunden an eine starre Vorlage. In den Haupttext füge ich z.B. sehr oft ein via CSS umrahmtes Zitat ein (manchmal keines, manchmal sogar bis zu 10), hie und da ein Bild etc. Das kann ich aber (meines Wissens nach) nicht mit so einer Klassenvorlage bewerkstelligen, da es fix aufgebaut ist.

Bleibt also nur noch die Variante mit normalen include-Dateien?
Oder kennt ihr noch andere Systeme (wenn möglich in deutsch)?

Vielen Dank für eure Hilfe!

mfg, Thomas

  1. Moin!

    Mir gefällt das Vorlagensystem mit objekt-orientierter Programierung mittels Klassen sehr gut, aber... ich bin dabei zu sehr gebunden an eine starre Vorlage. In den Haupttext füge ich z.B. sehr oft ein via CSS umrahmtes Zitat ein (manchmal keines, manchmal sogar bis zu 10), hie und da ein Bild etc. Das kann ich aber (meines Wissens nach) nicht mit so einer Klassenvorlage bewerkstelligen, da es fix aufgebaut ist.

    Ist es zu starr, programmierst du zu unflexibel. :)

    Unter "Vorlagensystem" verstehe ich folgendes: Du bindest eine existierende Klasse (per include oder require) ein, erstellst eine Instanz der Klasse, bindest dadurch (oder später) eine Template-Datei ein, die für die gewünschten Ausgabefelder Platzhalter besitzt, und übergibst der Klasse die einzufügenden Informationen. Am Ende wird das Resultat ausgegeben.

    Wenn du also optional Zitate kennzeichnen und Bilder einfügen willst, mußt du dein Template entsprechend flexibel aufbauen.

    Tatsache ist dabei, dass du (deswegen gibts ja Templates) ein gewisses Maß an Freiheit aufgibst, um Einheitlichkeit herzustellen.

    Im Zweifel setzt du in das Template ein Feld "inhalt" und befüllst es mit passendem, individuellen HTML-Code. Dann hast du immer noch den Vorteil, dass die restlichen Elemente im Template auf allen Seiten identisch sind.

    - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
    1. Hallo Sven!

      Ich bin ziemlich neu in der OOP und blicke das alles noch nicht so ganz durch. Hättest du mal Zeit mir ein einfaches Musterexemplar der Dateien so eines Systems zusammen zu basteln, damit ich es besser verstehen kann?

      Vielen Dank für Deine (etwaige) Hilfe.

      Liebe Grüße,
      Thomas

      1. Moin!

        Hallo Sven!

        Ich bin ziemlich neu in der OOP und blicke das alles noch nicht so ganz durch. Hättest du mal Zeit mir ein einfaches Musterexemplar der Dateien so eines Systems zusammen zu basteln, damit ich es besser verstehen kann?

        Zeit zum Zusammenbasteln sicher nicht. Aber Zeit für Tipps. Du mußt rumprobieren und sehen, wie die Sache läuft.

        Nehmen wir mal ein Beispiel: Die vlibTemplate-Klasse von http://vlib.activefish.com/. Gibts da kostenlos und frei verwendbar unter Artistic License.

        Diese Klasse bindest du ganz simpel per Include in dein Skript ein, um sie benutzen zu können.

        Dann erstellst du eine neue Instanz dieser Klasse, welche ein Template lädt. Als Beispiel in der Dokumentation: http://vlib.activefish.com/docs/multihtml/vlibtemplate/func_vlibtemplate.html

        Damit hast du eine Datei geladen, die du hinterher ausgeben willst, und in die du während der Skriptlaufzeit gewisse Inhalte reinpackst.

        Was deinen höchst variablen Content angeht, fallen mir da eigentlich nur zwei Lösungsmöglichkeiten ein:

        Entweder definierts du im Template ein Feld "content", in den der gesamte Content der Seite reingeht. Dann muß dein Skript entsprechend gewünschtes HTML generieren, also "<p>Absatztext</p><blockquote>Das Zitat</blockquote><p>Mehr Text</p>", und diesen Text dann dem Feld "content" übergeben.

        Die Übergabe ist simpel:
        $tmpl->setVar('content', $dein_langer_content_string);

        Und im Template wird die Stelle, an der die Ausgabe erscheinen soll, eingebaut:
        {tmpl_var name="content" escape="none"}

        Alternativ kannst du natürlich auch ein Array aufbauen, welches zweierlei Informationen enthält: Erstens den Inhalt des Textblocks, und zweitens den Typ (also Textblock oder Zitat - oder sonst noch etwas anderes, was möglich sein soll).

        Dann übergibst du an das Template keinen einzelnen, fertig zusammengebauten String mehr, der einfach nur noch reinkopiert wird (und dessen Gestaltung du dann ja auch nicht mehr im Template steuern könntest), sondern eben ein Array, welches du in einer Schleife abarbeitest - jeder einzelne Array-Block ist dabei Bestandteil eines zweidimensionalen Arrays:

        $textbloecke = array( array('text'=>'Absatztext', 'typ'=>'p'), array('text=>'Das Zitat','typ'=>'blockquote'), array('text'=>'Mehr Text','typ'=>'p'));

        So ungefähr. Die Typen müssen natürlich nicht identisch heißen, wie die zu verwendenden HTML-Tags, da kannst du im Prinzip eigene Kreationen einbauen. Im Template selbst kannst du mit IF-Abfragen dann steuern, welcher Teil (Absatz oder Zitat) für den Text verwendet werden soll.

        Und dem Redakteur, der den Text eingibt, mußt du dann logischerweise eine Möglichkeit zur Verfügung stellen, je Textblock eine der Möglichkeiten auszuwählen.

        Ich kann hier aber noch soviel schreiben: Du mußt es selbst ausprobieren. vlibTemplate ist eigentlich recht simpel zu bedienen, es bietet sicherlich auch nicht ganz soviele Möglichkeiten, wie andere Template-Engines, aber für den Anfang ist es deshalb nicht verkehrt.

        - Sven Rautenberg

        --
        "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
        (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
        1. Besten Dank!

          Werde es mal probieren.

          mfg, Thomas