tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
21
ZUGRIFFE
725
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Hallo!
    Ich habe schon viel über Template-systeme gelesen und mir smarty angeschaut, aber weitergekommen bin ich nur teilweise. Die meisten Tutorials haben mir nicht geholfen und tutorials.de habe ich schon vollkommen auf den Kopf gestellt. NICHTS!
    Ich bräuchte folglich eure Hilfe.

    Also ein Template-System ermöglicht die Trennung von Webdesign und Programmcode, damit der Webdesigner un der Programmierer getrennt arbeiten können. Wie funktioniert also das ganze?

    Man hat zwei Hauptdateien:
    1) Die Template Datei: template.tpl (in meinem Beispiel)
    2) Die Datei, die den Programmcode in das Template einfügt: index.php (in meinem Beispiel)

    So die Template-Datei enthält nun reinen HTML-CODE, in den, an den Stellen wo später der Programmcode stehen soll, Platzhalter eingesetzt sind. Diese können beliebig aussehen. Z.B.: {Platzhalter} oder [Platzhalter] oder #Platzhalter#
    Code:

    HTML-Code:
    <html> <head> <title>HALLO!</title> </head> <body> Zuletzt geändert am {lastchange}! {content} </body> </html>
    Doch was macht nun meine index.php? Als erstes bekommt sie per link den Namen der Datei übermittelt, die anstelle des Platzhalters {content} eingefügt werden soll.
    Code:

    HTML-Code:
    <a href="www.deine-domain.de?content=cont_news.php" class="impressum">News</a>
    Hier soll für den Platzhalter {content} also der Inhalt der Datei cont_news.php eingefügt werden. Des weiteren soll der Platzhalter {lastchange} durch die aktuelle Uhrzeit ersetzt werden. Wie sieht nun das Script dazu aus?
    PHP-Code:
    PHP-Code:
    <?php

        
    /* Deklarieren von Inhalten, die auf PHP basieren und immer für bestimmte Platzhalter eingesetzt werden müssen */ 
        
    $lastchange filemtime(basename($_SERVER['PHP_SELF']));
        
    $last_change date("d.m.Y H:i"$lastchange);
        
    $copyright date("Y");
        
    $url $_SERVER['PHP_SELF'];



    /* Die Klasse Template*/
    class template {

        private 
    $t
            
        
    /* Template anlegen */
        
    public function __construct($template) {
        
    $this->$template;
        }
        
        
    /* Den Content laden */
        
    public function loadcontent($content) {
        
    ob_start();
        include 
    $content;
        
    $newcont ob_get_contents();
        
    ob_end_clean();
        return 
    $newcont;
        }
        
        
    /* Den einzelnen Platzhaltern ihre Inhalte zuweisen */ 
        
    public function setvalue$name $inhalt ) {
        
    $insert .= "{" $name "}" $inhalt "{/" $name "}";
        }
        
        
    /* Platzhalter im Template finden, ersetzen und letztendlich das ganze ausgeben*/
        
    public function inserts($insert) {
            
    $html file_get_contents$this->);
            
    preg_match_all("|{[^}]+}(.*){/[^}]+}|U"$insert$extractPREG_PATTERN_ORDER);
            for    (
    $i=0;$i<count($extract[0]);$i++)    {
                
    $search substr($extract[0][$i],0,strpos($extract[0][$i],"}")+1);
                
    $replace $extract[1][$i];
                
    $html str_replace($search$replace$html);
            }
            echo 
    $html;
        }

    }


    $t = new Template("template.tpl");
    $t->loadcontent($_GET['content']);
    $t->setvalue"change" $last_change );
    $t->setvalue"server" $url );
    $t->setvalue"copy" $copyright );
    $t->setvalue"content" $newcont );
    $t->inserts$insert );

    ?>
    So! Wie einigen gleich auffallen wird, führe ich den Inhalt der per Link übergebenen Datei cont_news.php per include() aus, halte jedoch die Ausgabe mit ob_start() zurück und speicher die Rückgabe stattdessen in einer Variable. Diese Variable enthält nun nur noch Design-Code, denn der Programmcode wurde bereits ausgeführt.

    Nun kann man das irgendwie auch mit eval() lösen, wobei aber weitere Probleme auftreten. Und zwar gibt es bei eval() auch eine Fehlermeldung, wenn der von eval() bearbeitete String keinen php-code enthält, was in meinem content nicht automatisch der fall sein muss, denn ich kann an Stelle des Platzhalters {content} sowohl php-code als auch einfachen html-code einfügen wollen. Zudem schafft eval() eine große Sicherheitslücke, da jeglicher Code der mit eval() behandelt wird auch ausgeführt wird. So wirdauch der Code ausgeführt, den ein User in ein Gästebuch schreibt, das dann seine Einträge mit Hilfe einer Template -Engine Kreiert.

    Ich will also einfach nur das unveränderliche Design vom variablen Content trennen, um für mich die Sache einfacher und übersichtlicher zu halten.

    Nun endlich meine Fragen:
    Wo liegt mein Fehler in meinen Überlegungen bzw. in meinen Scripten?
    Gibt es Verbesserungsvorschläge?
    Eine Möglichkeit den Code zu verkürzen.

    Ich entschuldige meine langen Ausführungen, aber ich dachte es wäre wichtig, um euch auf den aktuellen Stand meiner Erkenntnis zu bringen. Ich möchte des weiteren an dem Vorhaben dies selbst umzusetzen (natürlich manchmal mit eurer hilfe ;D ) festhalten und nicht auf Smarty / FastTemplate / EasyTemplate und COKG ausweichen.

    Ich bedanke mich für euer Verständnis und eure Geduld!
    MfG, Andy
     

  2. #2
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Ein mir aufgefallener Fehler ist, dass die $insert-Variable nur innerhalb der Aufrufe der Methoden setvalue() und inserts() existiert.
     
    Markus Wulftange

  3. #3
    Radiate Radiate ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Also wenn du nicht ausweichen willst auf andere Templates, wie wäre es mit meinem Tutorial?
    Okay, eventuell ist es noch nicht freigeschaltet, daher mal mein Vorschlag:

    Du erstellst eine variables.php, ich benutze immer die Struktur:

    root/languages/german/main.php
    PHP-Code:
    $lang['hallo'] = 'Hallo'
    root/templates/standard/index.tpl
    PHP-Code:
    <?php echo $lang['hallo']; ?>
    root/index.php
    PHP-Code:
    include('languages/german/main.php');
    include(
    'templates/standard/index.tpl'); 
    Und schon kannste indem du jedesmal dies hier benutzt <?php echo $lang['hallo']; ?> eine Variabel einsetzen.
    Soweit habe ich das verstanden, oder suchst du noch etwas anderes?
     

  4. #4
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    @Radiate: Ich verstehe, was du meinst, sehe allerdings den Sinn dahinter nicht. Ich wollte mein Design schon complett vom Programmcode trennen. Kannst mir ja mal den Link zu deinem Tutorial geben.

    @Gumbo: Soll das heiße, dass ich diese Variable global machen muss? Oder wie muss ich das ändern, damit es stimmt?

    Danke für eure schnelle Antwort!
    MfG, Andy
     

  5. #5
    Radiate Radiate ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Also soweit ich das sehe, kann man unmöglich den Code vom Design trennen!
    Das ist einfach undenkbar.
    Der Grund dürfte klar sein, weil du variabeln einsetzen willst um Daten aus einer Datenbank einzusehen, daher weiß ich gerade nicht ob mein Tutorial über diesen Link angezeigt wird, wenn ja dann ist es hier:

    http://www.tutorials.de/forum/tutori...variablen.html

    Also meine Variante benötigt keine Template-Engine, lediglich gute übersicht der Verzeichnisse es seidenn du ballerst alles in ein Verzeichnis.

    Gruß
     

  6. #6
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Nein das heißt es nicht unbedingt. Es reicht sie in der Klasseninstanz global verfügbar zu haben. Eine eigenes Klassenattribut reicht dafür also aus.
     
    Markus Wulftange

  7. #7
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Also auf das Tutorial darf ich schonmal nicht zugreifen. Da habe ich keine Rechte.
    Zitat Zitat von Radiate Beitrag anzeigen
    Also soweit ich das sehe, kann man unmöglich den Code vom Design trennen!
    Und warum sollte das nicht gehen? Mann erstellt eine reine Html- oder besser noch XHTML-Seite, die das Grundlegende Design beinhaltet. An all jene Stellen, wo nun allerdings php-code eingefügt werden soll, setzt man, wie von mir beschrieben Platzhalter.

    Ein anderes Script greift sich diese Html oder XHtml datei und sucht nach Platzhaltern. Wenn sie diese Gefunden hat ersetzt es sie automatisch speichert das ganze in einer Variable und gibt es aus.
    Zitat Zitat von Radiate Beitrag anzeigen
    Der Grund dürfte klar sein, weil du variabeln einsetzen willst um Daten aus einer Datenbank einzusehen.
    Datenbank? Wer? Wie? WO? WAS? Grund? Hab ich doch nichts von hgesagt und selbst wenn dann leuchtet mir dein Grund nicht ein.

    Zitat Zitat von Gumbo Beitrag anzeigen
    Nein das heißt es nicht unbedingt. Es reicht sie in der Klasseninstanz global verfügbar zu haben. Eine eigenes Klassenattribut reicht dafür also aus.
    Also so?
    PHP-Code:
    <?php
    class template {

        private 
    $t;
        private 
    $insert
            .......
    }
    ?>
    MfG, Andy
    Geändert von Avedo (31.05.07 um 18:44 Uhr)
     

  8. #8
    Radiate Radiate ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Öhm, sry.
    Datenbank war natürlich ein Weg, im Normalfall nimmt man Variabeln oder Einträge aus einer File namens *.php.
    Aber auch hier müssen deine Sogenannten Platzhalter in den Design Code rein, sprich, sie werden ersetzt durch deinen in irgendeiner Datei festgelegten Werte.
    So, nun ist hier meine Theory aber richtig, statt solche Platzhalter kannste doch auch dieses hier benutzen, ist halt nur etwas länger als {WERT} , meine -> <?php echo $var['WERT']; ?>.

    Verstehst du nun was ich meine?
     

  9. #9
    Registriert seit
    Dec 2002
    Ort
    Trier
    Beiträge
    17.502
    Blog-Einträge
    10
    Variablen sind auch nichts anderes als Platzhalter für andere Werte, nämlich für die Variablenwerte.
     
    Markus Wulftange

  10. #10
    Radiate Radiate ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Ja das wusste ich, doch um solche Platzhalter zu benutzen benötigt man doch meines Wissens nach eine Engine, also eine Template-Engine, oder nicht?
    Und ich habe mir diese Technik von phpBB abgeschaut, die verwenden genau das wie ich es benutze.

    Also nicht falsch verstehen, ich benutze deren Technik!
     

  11. #11
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Ich wollte es nun leider aber mit einer Template Engine lösen, und habe mir dazu ja auch eine kleine eigene Template Klasse gebastelt.

    Trotz error_reporting(E_ALL); erhalte ich keine Fehlermeldungen. Meine Links sehen allerdings so:
    Code :
    1
    
    http://www.puk.de/sorsmc/test/%3Cserver%3E?content=cont_news.php
    statt so:
    Code :
    1
    
    http://www.puk.de/sorsmc/test/index?content=cont_news.php
    aus.

    Und keiner der Platzhalter wird ersetzt. Wo liegen meine Fehler?
    MfG, Andy
     

  12. #12
    Radiate Radiate ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Also so wie ich das sehe machst du das ganze Online, gehe ich richtig der Annahme?
    Wenn das so ist, dann musste die Links nicht mit dem genauen URL und der Linknamen bezeichnen, du solltest nur darauf achten das du deinen vollständigen ROOTPFAD in der php.ini drin stehen hast was echt hart zu knacken ist, weil du ja wahrscheinlich keinen Zugriff darauf hast.

    Also solltest du dies in deiner Klasse definieren, also nicht define() sondern eintragen, etwa so:

    /usr/export/www/hosting/espoleon/com/templates/subSilver/

    Also das ist bloß ein Beispiel aber da sollten dann deine PFADE drin stehen.

    p.s. das fällt mir erstmal dazu ein
     

  13. #13
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    So die Anmerkung von Cumbo hat mir schon etwas geholfen. Musste die funktion setvalue() wie folgt anpassen, damit fasst alle Platzhalter ersetzt werden.
    PHP-Code:
    <?php
        
    /* Den einzelnen Platzhaltern ihre Inhalte zuweisen */ 
        
    public function setvalue$name $inhalt ) {
        global 
    $insert;
        
    $insert .= "{" $name "}" $inhalt "{/" $name "}";
        }
    ?>
    Das Problem, dass der Platzhalter für den Content niccht ersetzt und das ersetzte angezeigt wird bleibt.
    MfG, Andy
     

  14. #14
    Registriert seit
    Mar 2004
    Beiträge
    490
    Irgendwie verstehe ich das nicht.
    In dem Beispiel Code von gaaanz oben sieht dein Platzhalter wie folgt aus {lastchange}.
    Deine setValue Methode baut die Platzhalter wie folgt auf (am Beispiel von "change" aus deinem Codesnippet): {change} CONTENT {/change}.

    Das eigentliche ersetzen erfolgt dann in insert() mit dem preg_match_all. Dort nimmst du alles wieder auseinander, die matches werden dann in loops gegen den Content getauscht. Alles läuft über den $insert, was ein String ist. Hmm, ich finde das alles sehr kompliziert und mit dem preg_match_all, der folgenden foreach Schleife nicht gerade performant.

    Weitere Probleme habe ich auch mit der loadContent() Methode. Diese hat als Rückgabewert den Inhalt des Templates (oder was da included wird).
    Diese Methode der klasse rufst du wie folgt auf: $t->loadcontent($_GET['content']);

    Wohin wird denn da der return $newcont zurückgegeben?


    Wäre es nicht wie folgt einfacher:

    Dein Template enthält die Platzhalter in der Form {lastchange}, so wie du es bis jetzt auch hast.

    Deine SetValue() Methode würde ich umschreiben zu:

    PHP-Code:
    public function setvalue($tag$value)
    {
       
    // vorher in der klasse noch ein private $platzhalter;
       
    $complete_tag '{'.$tag.'}';
       
    $this->platzhalter[$complete_tag] = $value;

    Nun wird das Template geladen sagen wir mal in klassenvariable $this->template (als Beispiel, bei dir in der insert() mit file_get_contents)
    Jetzt werden einfach die Tags ersetzt durch die Values
    Beispiel:
    PHP-Code:
    function parsetemplate()
    {
      echo 
    str_replace(array_keys($this->platzhalter), array_values($this->platzhalter), $this->template);

    Das ganze weicht natürlich stark von deinem Ablauf ab und ist nur eine grobe Idee und ich weiss nicht, ob dies überhaupt eine gute Umsetzung hinsichtlich Geschwindigkeit ist (dieses str_replace konstrukt mit array_keys und _values).
    Ansonsten einfach mein Post ignorieren
     

  15. #15
    Briefkasten Briefkasten ist offline Mitglied Gold
    Registriert seit
    Feb 2003
    Ort
    Österreich / Feldkirch
    Beiträge
    135
    Ich hab mir jetzt den Code nicht genau angeschaut aber wieso def. du die Platzhalter so kompliziert?

    Ich hab das bei mir so gemacht <irgenwelcher html code>[{platzhalter1}]htmlcode...
    Die html Datei wird schritt für schritt abgearbeitet.
    Jede Zeile überprüfen ob ein Platzhalter vorhanden ist.
    Ist kein Platzhalter vorhanden --> Zeile also den reinen eingelesenen html Code ausgeben.
    Ansonsten htmlcode + neuen Code z.B.: aus DB + html code ausgeben

    Du kannst so auch dyn. code ausführen.

    Ein paar Nachteil bei diesem System sind:
    Header funktioniert nur bedingt wenn ob_start() vorhanden ist
    eingebaute dyn. Seiten können nicht mehr flexibel eingesetzt werden.
     

Ähnliche Themen

  1. Template System...
    Von Vectormaster im Forum PHP
    Antworten: 12
    Letzter Beitrag: 05.03.09, 12:41
  2. Template system?
    Von Kalma im Forum PHP
    Antworten: 1
    Letzter Beitrag: 11.07.06, 17:48
  3. Template System
    Von mtk-flo im Forum PHP
    Antworten: 6
    Letzter Beitrag: 08.03.06, 14:54
  4. Template-System
    Von undertaker im Forum PHP
    Antworten: 8
    Letzter Beitrag: 11.03.04, 19:49
  5. template system
    Von js-mueller im Forum PHP
    Antworten: 4
    Letzter Beitrag: 06.03.03, 16:49