Ankündigung

Einklappen
Keine Ankündigung bisher.

Was ist Aufgabe des Templates (Smarty), was nicht?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Was ist Aufgabe des Templates (Smarty), was nicht?

    Hallo,

    ich versuche mich grade in die Verwendung von Templates bzw. die Trennung von Logik und Design in PHP reinzufuchsen.
    Ich habe dazu erstmal Smarty als Templatesystem gewählt.

    Mir sind nur einige Dinge nicht ganz klar.
    Beispiele:

    Ein aufbereiten eines Textes einer Variable (also htmlentities() und nl2br()) mache ich idealerweise wo? Direkt im Code - also bevor ich die Variable Smarty übergebe oder erledige ich das in Smarty über {$var|escape|nl2br}?
    Oder überlegt man sich das von Fall zu Fall?

    Oder wenn ihr ein Datum habt - formatiere ich das erst in Smarty? {$datum|date_format:"%d.%m.%Y %H:%M"}
    Oder erledige ich das zuvor und übergebe Smarty ein formatiertes Datum?
    Ich möchte eigentlich auch die Möglichkeit das Datumsformat zentral an einer Stelle zu ändern - wie geht das mit Smarty am idealsten?

    Nächstes Beispiel:
    Wenn ich in einer Liste einen Eintrag hervorheben möchte - "darf" ich das in Smarty machen oder "muss" ich es sogar?


    Bin für alle Hinweise dankbar.

    Agrajag

  • #2
    Meine persönliche Meinung ist, dass das Template alles schon im richtigen Format geliefert bekommen sollte.

    Sonst hab ich irgendwann die halbe Logik im Template und wenn ich dann die Sprache umschalten will, muss ich auch alle Templates kopieren, weil die Datums-Darstellung darin schon fest verankert ist.

    Schau dir aber auch jeden Fall auch MVC an!

    Kommentar


    • #3
      Hallo Agrajag,

      du solltest hier noch einen Schritt weiter gehen und dich - wie Zergling schon sagte - mit weiterführender Literatur zu MVC und 3-Schicht-Architektur. Hier gilt grundsätzlich folgendes:

      - Für die Inhalte der Applikation werden eigene Objekte (Domain-Objekte deklariert, die die Daten der Applikation enthalten)
      - Geschäftslogik wird in einer eigenen Software-Schicht gekapselt (macht sowas wie Formatierung von Datums, oder Bearbeitung von Inhalten in den Domain-Objekten)
      - Daten-Acquise fällt in den Aufgaben-Bereich der Datenschicht. Diese läd die Daten irgendwoher und stellt diese in Domain-Objekten der Business-Schicht zur Verfügung
      - Die Darstellung der GUI (hier in HTML) übernimmt die Präsentations-Schicht. Ein Teil dieser kann eine Template-Engine wie Smarty sein.

      Mach mir ein Beispiel und ich kann dir das detaillierter erklären.

      Kommentar


      • #4
        Zitat von Zergling
        Meine persönliche Meinung ist, dass das Template alles schon im richtigen Format geliefert bekommen sollte.
        So hab ich es bisher auch. Wobei es mir da irgendwie so vorkommt als geht mir die Flexibilität verloren. Beispielsweise könnte ich im Template einen Text in einer Textarea platzieren wollen, dann wäre es schlecht wenn er schon davor nl2br() drüberlief...

        [quote="dr.e"]
        Zitat von dr.e.
        du solltest hier noch einen Schritt weiter gehen und dich - wie Zergling schon sagte - mit weiterführender Literatur zu MVC und 3-Schicht-Architektur. [...]
        Ich hab' schon erste Gehversuche mit dem MVC-Pattern gemacht. Allerdings in Java und da fiel mir das schon schwer - und das jetzt auf PHP bzw. Webanwendungen zu übertragen schaff ich irgendwie (noch) nicht.

        Mach mir ein Beispiel und ich kann dir das detaillierter erklären.
        Danke für das Angebot.

        Ok, ich versuch mal ein kleines Beispiel zu konstruieren:

        Ich habe 2 Klassen User und Verein. Die User und Vereine sind in der Datenbank abgelegt.
        Ich habe eine index.php die je nach URL-Parameter verschiedene Dateien einbindet.
        Eine solche Datei kann z.B. der Login sein (include login.php in der index.php) - dort benutze ich dann ein DAO um den passenden User aus der Datenbank zu holen.
        Oder es kann eine Datei sein in der sich ein User in einen Verein einträgt etc. pp. (anmelden.php)

        In diesen Dateien hol ich mir also die entsprechenden Objekte und mach weiß Gott was damit.
        In jeder dieser Dateien nutze ich dann Smarty und ein Template um die Ausgabe zu erledigen.
        z.B. für die anmelden.php, um eine Liste der Vereine anzuzeigen:
        Ich hole mir wieder über ein DAO (VereinDAO) alle Vereine (also ein Array mit Verein-Objekten). Das durchlaufe ich und bastel mir dabei ein Array für Smarty / das Template zusammen.

        Also Quasi (ich weiß, dass das nicht hinhaut - nur dem Verständnis halber):
        Model: die beiden Klassen User und Verein
        View: die Template-Dateien
        Controller: die includierten PHP-Dateien (bspw. login.php).

        Mir fällt gerade kein besseres Beispiel ein...

        Kommentar


        • #5
          Hmm, das ist doch schon mal nicht so schlecht für den Anfang. Deine index.php ist in diesem Fall der (geskriptete) Pagecontroller, der Funktionen einbindet. Was du an deinem Design noch verbessern könntest wär folgendes:

          - Erstelle eine Klasse, die du "Mapper" nennst und implementiere dort generisch, oder fallspezifisch alle Methoden, die du brauchst um Daten zu lesen.
          - Implementiere eine "Manager", der den "Mapper" läd und sich von diesem die nötigen Daten geben lässt und entsprechend aufbereitet an deine "DocumentController" (z.B. anmelden.php) weitergibt.

          Dann hast du bereits ein 3-Schicht-Modell und musst in den jeweiligen Funktions-Dateien nur noch auf diese zurückgreifen. Vorteil ist zudem, dass du die Funktionen an zentraler Stelle einbinden kannst und dich innerhalb der Funktions-Dateien nicht mehr um das Hnadling mit der DB o.ä. kümmern musst.

          Solltest du Fragen haben, frag einfach!

          Kommentar


          • #6
            Zitat von dr.e.
            Solltest du Fragen haben, frag einfach!
            Ich hab leider nicht wirklich viel verstanden um ehrlich zu sein

            - Erstelle eine Klasse, die du "Mapper" nennst und implementiere dort generisch, oder fallspezifisch alle Methoden, die du brauchst um Daten zu lesen.
            Mit "Daten lesen" meinst du z.B. Objekte aus der Datenbank holen?
            Also statt für jedes Objekt ein DAO zu erstellen, erstell ich eine Mapper-Klasse? Oder habe ich immernoch für jede Klasse ein DAO nur benutze ich die nicht mehr direkt sondern über die Mapper-Klasse?
            (oder ist die Mapperklasse sowas wie Hibernate bei Java?)


            - Implementiere eine "Manager", der den "Mapper" läd und sich von diesem die nötigen Daten geben lässt und entsprechend aufbereitet an deine "DocumentController" (z.B. anmelden.php) weitergibt.
            Hier steig ich jetzt total aus.
            Was macht der Manager genau? Ich weiß ja immer erst in der anmelden.php selbst welche Daten ich dort brauche? Was meinst du mit "aufbereitet"?

            [...] an zentraler Stelle einbinden kannst und dich innerhalb der Funktions-Dateien nicht mehr um das Hnadling mit der DB o.ä. kümmern musst.
            Das muss ich doch jetzt auch nicht - glaub ich Ich lade die Objekte über ein DAO und ich speichere sie wieder über ein DAO. Mit der DB hab ich in den Funktions-Dateien (also z.b. anmelden.php) eigentlich nichts zu tun.

            Du siehst mir fehlt noch ein bißchen das grundlegende Verständnis...
            Ich glaub ich muss das noch ein paarmal lesen und sacken lassen

            Kommentar


            • #7
              Hallo Agrajag,

              Ich hab leider nicht wirklich viel verstanden um ehrlich zu sein
              Dann ist es umso besser, dass du nachfragst.

              Mit "Daten lesen" meinst du z.B. Objekte aus der Datenbank holen?
              Also statt für jedes Objekt ein DAO zu erstellen, erstell ich eine Mapper-Klasse? Oder habe ich immernoch für jede Klasse ein DAO nur benutze ich die nicht mehr direkt sondern über die Mapper-Klasse?
              (oder ist die Mapperklasse sowas wie Hibernate bei Java?)
              Das ist ja fast in's Schwarze. Es bedeutet folgendes:

              - Du hast in deiner Applikation einige Domain-Objekte (z.B. Gästebuch, Gästebucheintrag, Kommentar, Liste, Listeneintrag).
              - Es existiert ein zentraler Mapper, der alle diese Objekte kennt und Methoden besitzt um diese mit Daten aus der DB füllen kann.

              Beispiel: In einem Gästebuch hast du i.d.R. 2 Domain-(=Daten)-Objekte, Gästebuch und Eintrag. Du kannst nun dem Mapper eine Methode "verpassen", die loadGuestbookByPageRange() heißt und die dir je nach Übergabeparametern ein Guestbook-Objekt mit einigen Entries zurückgibt.

              Hier steig ich jetzt total aus.
              Was macht der Manager genau? Ich weiß ja immer erst in der anmelden.php selbst welche Daten ich dort brauche? Was meinst du mit "aufbereitet"?
              OK. ich erklär dir das mal mit Pseudocode. Zuerst möchte ich noch auf den "Manager" eingehen. Der Manager ist eine weitere Schicht innerhalb deiner Anwendung, der den Prozess kapselt. Hier kannst du beispielsweise dein Gästebuch-Objekt mit den Einträgen noch aufbereiten, sprich beispielsweise die Einträge durchiterieren und das Datumsformat korrigieren oder zum Gästebuch weitere Konfigurationen (aktivierte Smilies, et. al.) hinzufügen. Codemäßig sieht das wie folgt aus:

              anmeldung.php

              PHP-Code:

              $Manager 
              = new GuestbookManager();
              $Guestbook $Manager->loadGuestbookByPageRange([..]);

              $Entries $Guestbook->getEntries();

              foreach(
              $Entries as $Item){
                 
              // Hier wird die Ausgabe erledigt
              }
              ?> 

              Manager.php

              PHP-Code:

              class Manager
              {

              function 
              loadGuestbookByPageRange([..]){

                 
              $Mapper = new Mapper();
                 
              $Guestbook $Mapper->loadGuestbook([..]);
                 
              $Entries $Guestbook->getEntries();

                 foreach([..]){
                    
              $Entries->setDate(date_format([..],$Entries->getDate());
                 }

                 return 
              $Guestbook;
              }

              }
              ?> 

              Das muss ich doch jetzt auch nicht - glaub ich Ich lade die Objekte über ein DAO und ich speichere sie wieder über ein DAO. Mit der DB hab ich in den Funktions-Dateien (also z.b. anmelden.php) eigentlich nichts zu tun.
              Das ist auch ok so. In der anmelden.php instanziierst du dir einfach den Manager und lädst Daten, oder übergibst ihm Daten zum Speichern (saveGuestbookItem()). Letzteres würde in der anmelden.php so aussehen:

              PHP-Code:

              $Entry 
              = new Entry();
              $Entry->setName($_GET['name']);
              $Entry->setContent($_GET['content']);

              $Manager = new Manager();
              $Manager->saveGuestbookItem($Entry);
              ?> 

              Du siehst mir fehlt noch ein bißchen das grundlegende Verständnis...
              Ich glaub ich muss das noch ein paarmal lesen und sacken lassen
              Klar war das viel auf einmal, aber du wirst sehen, in ein paar Wochen ist das im Blut.

              Kommentar


              • #8
                Vielen Dank erstmal für deine Mühe.
                Ich werd' mir das mal anschauen und ein bißchen rumprobieren und dann kommt die nächste Welle an Fragen

                Kommentar


                • #9
                  Hallo Agrajag,

                  ich habe heute meine alte Page-Controller-Beispielseite wieder aufpoliert und die Doku upgedatet nachgezogen. Wenn du Lust hast das Beispiel anzusehen, kannst du dir unter

                  http://media.adventure-php-framework...l_webseite.zip

                  das Package runterladen. Einfach im DocumentRoot - oder einem Unterordner - entpacken und die index.php aufrufen.

                  Es vermittelt dir das oben erklärte an einem praktischen Beispiel. Solltest du Fragen haben, dann lass es mich wissen.

                  Kommentar

                  Lädt...
                  X