tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
473
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von newwarrior
    newwarrior newwarrior ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Holzdorf
    Beiträge
    168
    Hallo,

    ich habe eine kleine Templateklasse geschrieben für meine eigene Projekte. Ja ich weiß es gibt sehr gute andere Projekte, doch sind diese mir meistens zu groß bzw. einfach nicht mein Ding und ich lerne ja auch noch dabei.

    Also wie folgt sieht sie aus:

    PHP-Code:
    <?php
        error_reporting
    (E_ALL);
        
        class 
    template {
        
            
    /*
                Variables that be use in that class
                and their content
            */
            
            
    private $templateDIR 'templates/';
            private 
    $templateName '';
            private 
    $templateFile '';
            private 
    $template '';
            
            private 
    $leftborderF '{';
            private 
    $rightborderF '}';
            private 
    $leftborderVAR '{$';
            private 
    $rightborderVAR '$}';
            
            public function 
    __construct($tpl_dir ''$lang_dir '')
            {
                if(!empty(
    $tpl_dir))
                    
    $this->templateDIR $tpl_dir;
                    
                if(!empty(
    $lang_dir))
                    
    $this->languageDIR $lang_dir;    
            }
            
            public function 
    load($file)
            {
                
    $this->templateName $file;
                
    $this->templateFile $this->templateDIR.$file;
                
               if( !empty(
    $this->templateFile) ) {
                    if( 
    file_exists($this->templateFile) ) {
                        
    $this->template file_get_contents($this->templateFile);
                    } else {
                        return 
    false;
                    }
                } else {
                   return 
    false;
                }
                
              
    $this->parseTemplate();
                            
            }
            
            public function 
    assign($replace$replacement)
            {
                
    $this->template str_replace($this->leftborderVAR.$replace.$this->rightborderVAR$replacement$this->template);
            }
            
            private function 
    parseTemplate() {
                while( 
    preg_match"/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
                                   
    .$this->rightborderF ."/isUe"$this->template) )
                {
                    
    $this->template preg_replace"/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
                                                    
    .$this->rightborderF."/isUe",
                                                    
    "file_get_contents(\$this->templateDIR.'\\1'.'.'.'\\2')",
                                                    
    $this->template );
                }
            }
            
            public function 
    display() {
                echo 
    $this->template;
            }
            
        } 

    ?>
    Aktuell arbeite ich noch ein Cache Verfahren ein.
    Was kann ich noch verbessern?

    Hatte überlegt noch mit Blöcken zu arbeiten, weiß aber noch nicht so wirklich wie ich das am besten machen soll.

    Danke für die Hilfe.

    NW
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Wenn du bequem bist, kannst du noch die magische Methode __set() implementieren.

    Hast du einen Unit-Test dafür?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Avatar von newwarrior
    newwarrior newwarrior ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Holzdorf
    Beiträge
    168
    Klar.
    Klick hier
    Die Templatedateien liegen unter: klick hier

    Ich weiß wofür __set() genutzt wird, allerdings verstehe ich hier noch nicht ganz den Vorteil zur meiner benutzten Methode.
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Ich meinte einen Unit-Test im Sinne von PHPUnit oder etwas ähnliches.

    Der Vorteil von Unit-Tests mittels Test-Klasse ist offensichtlich: "Führt meine Änderung oder mein neues Feature XYZ dazu, das meine bisherige Implementierung noch funktioniert?"

    Es im Browser ausgeben zu lassen ist IMHO kein Unit-Test.

    Die __set()-Methode bringt keine Verbesserung gegenüber deiner Implementierung. Außer vielleicht der Lesbarkeit. Was schön wäre, wenn deine assign-Methode eine Back-Reference auf sein eigenes Objekt zurück geben würden, denn dann könnte man so was machen:

    Code php:
    1
    2
    3
    4
    5
    
    $o = new template('directory', 'de');
    $o->assign('foo', 'bar')
      ->assign('xyz', 'abc')
      ->assign('price', PriceHelper::Calculate($singleNet, $amountOfGoods, $vatRate)
     // weitere assigns....
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Avatar von newwarrior
    newwarrior newwarrior ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Holzdorf
    Beiträge
    168
    Was schön wäre, wenn deine assign-Methode eine Back-Reference auf sein eigenes Objekt zurück geben würden, denn dann könnte man so was machen:
    Darunter kann ich mir jetzt leider mal absolut nichts vorstellen.
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Deswegen habe ich ein Beispiel hin geschrieben. Normalerweise dürfte es genügen, wenn du in assign() einfach $this returnierst.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    Avatar von newwarrior
    newwarrior newwarrior ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Holzdorf
    Beiträge
    168
    Mit dem Beispiel, verstehe ich so :
    PriceHelper::Calculate($singleNet, $amountOfGoods, $vatRate)
    Calculate ist eine Funktion in der Klasse PriceHelper und du übergibst die werte.
    Und das Ergebnis soll dann ausgeben werden, ist doch richtig.
    Müsste doch auch so funktionieren.

    Habe es jetzt mal so gemacht:

    PHP-Code:
            public function assign($replace$replacement)
            {
                
    $this->template str_replace($this->leftborderVAR.$replace.$this->rightborderVAR$replacement$this->template);
                
                return 
    $this->template;
            } 
    Geändert von newwarrior (22.11.11 um 13:44 Uhr)
     

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Das war nur ein Beispiel. Ich denke mal, das es bei dir keine Klasse PriceHelper mit einer statischen Methode Calculate gibt. Es ging mir nur um das assign(), was machen an ein assign() hängen kann.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    Ich denke was dir Saftmeister sagen will ist folgendes:

    Eine Assign-Methode welches ein internes Array befüllt mit der magischen Setter-Methode. Welches "Method-Chaning" beinhaltet, so das du das du mehrere "Assigns" in einem Aufwasch erledigen kannst.
    Ich persönlich würde es auch so machen, das parsen des Templates und ersetzen mit den Variablen aus dem internen Array dann in der Display-Methode.
     
    Die Schweine von heute sind unsere Schnitzel von morgen!

  10. #10
    Avatar von newwarrior
    newwarrior newwarrior ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Holzdorf
    Beiträge
    168
    Ok, jetzt habe ich es verstanden

    siehe hier:
    PHP-Code:
    <?php
        error_reporting
    (E_ALL);
        
        class 
    template {
        
            
    /*
                Variables that be use in that class
                and their content
            */
            
            
    private $templateDIR 'layout/templates/white/';
            private 
    $languageDIR 'lang/';
            private 
    $templateName '';
            private 
    $templateFile '';
            private 
    $template '';
            
            private 
    $leftborderF '{';
            private 
    $rightborderF '}';
            private 
    $leftborderVAR '{$';
            private 
    $rightborderVAR '$}';
            
            public function 
    __construct($tpl_dir ''$lang_dir '')
            {
                if(!empty(
    $tpl_dir))
                    
    $this->setTemplateDIR($tpl_dir);
                    
                if(!empty(
    $lang_dir))
                    
    $this->setLanguageDIR($lang_dir);    
            }
            
            public function 
    setTemplateDIR($dir)
            {
                
    $this->templateDIR $dir;
                return 
    $this;
            }
            
            public function 
    setLanguageDIR($dir)
            {
                
    $this->languageDIR $dir;
                return 
    $this;
            }
            
            public function 
    setTemplateName($name)
            {
                
    $this->templateName $name;
                return 
    $this;
            }
            
            public function 
    setTemplateFile($file)
            {
                
    $this->templateFile $file;
                return 
    $this;
            }
            
            public function 
    setTemplate($template)
            {
                
    $this->template $template;
                return 
    $this;
            }
            
            public function 
    load($file)
            {
                
    $this->setTemplateName($file);
                
    $this->setTemplateFile($this->templateDIR.$file);
                
               if( !empty(
    $this->templateFile) ) {
                    if( 
    file_exists($this->templateFile) ) {
                        
    $this->setTemplate(file_get_contents($this->templateFile));
                    } else {
                        return 
    false;
                    }
                } else {
                   return 
    false;
                }
                
              
    $this->parseTemplate();
                            
            }
            
            public function 
    assign($replace$replacement)
            {
                
    $this->setTemplate(str_replace($this->leftborderVAR.$replace.$this->rightborderVAR$replacement$this->template));
            }
            
            private function 
    parseTemplate() {
                while( 
    preg_match"/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
                                   
    .$this->rightborderF ."/isUe"$this->template) )
                {
                   
    $this->setTemplate(preg_replace"/" .$this->leftborderF ."include file=\"(.*)\.(.*)\""
                                                    
    .$this->rightborderF."/isUe",
                                                    
    "file_get_contents(\$this->templateDIR.'\\1'.'.'.'\\2')",
                                                    
    $this->template ));
                }
            }
            
            public function 
    display() {
                echo 
    $this->template;
            }
            
        } 

    ?>
    Ähm, eine andere Frage habe ich allerdings noch, und zwar habe ich ein kleines Problem.

    PHP-Code:
        $blog_obj= new blog($dbh);
        
    $data_blog $blog_obj->getAll();

        foreach(
    $data_blog as $value)
        {
            if(
    $value->blog_published == 1)
                
    $world "<a href='operation/no_published.php?blog_id=$value->blog_id' class='ask_published_yes'><img src='img/world.png' title='published' /></a>";
            else
                
    $world "<a href='operation/published.php?blog_id=$value->blog_id' class='ask_published_no'><img src='img/world_delete.png' title='not published' /></a>";        
            
            
    $content_var .= "
                <table class='videos'>
                    <tr>
                        <td style='text-align:right;font-size:9px;'>"
    .date("h:i a || l dS F Y"$value->blog_date)."</td>
                    </tr>
                </table><br />
            "
    ;
        } 
    Folgender Codeabschnitt ist vorhanden, wo ich jetzt gerne Code von HTML trennen würde. Doch ich sehe jetzt nur die einzige Möglichkeit darin, dass ich jetzt die Tabelle in eine tpl Datei packe und diese immer wieder in der Schleife lade. Für das IF und ELSE muss ich das gleich dann auch noch mal machen.
    Kann ich so was umgehen?
    Also beim Daten ausgeben?
    Geändert von newwarrior (27.11.11 um 07:14 Uhr)
     

  11. #11
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Grundsätzlich könntest du es umgehen, in dem du Kontroll-Strukturen in die Templates einbaust. Kennst du Smarty?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  12. #12
    Avatar von newwarrior
    newwarrior newwarrior ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Ort
    Holzdorf
    Beiträge
    168
    Ja kenne ich, warum?
     

  13. #13
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Nun damit wollte ich darauf hindeuten, wie man Kontroll-Strukturen in Templates einbaut. Also if-Konditions, Schleifen, etc. Deine Tabelle könntest du so abbilden:

    - Füge in deinem Template die Kopf-Zeile für eine Tabelle ein.
    - Schleife über eine assignte Variable (welche ein Array ist) und bei jedem Schleifen-Durchlauf fügst du eine Tabellen-Zeile hinzu.
    - Assigne im PHP-Code deinem Template-Objekt ein Array.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  14. #14
    Kyôya Kyôya ist offline Mitglied Silber
    Registriert seit
    Nov 2011
    Ort
    Würzburg
    Beiträge
    62
    Hi,

    es gibt zwei bessere Template-Engines als Smarty:
    1. PHP selbst
    2. Twig


    Gruß Kyoya Stefan
     
    Oracle Certified MySQL 5 Professional Developer
    Zend Certified PHP 5.3 Engineer

    Vorträge, Webinare, etc im Mayflower - Blog

Ähnliche Themen

  1. iterator an templateklasse übergeben
    Von Nukleo im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 03.11.09, 12:49
  2. einfache Templateklasse? Tutorial?
    Von soyo im Forum PHP
    Antworten: 2
    Letzter Beitrag: 19.09.06, 15:37
  3. Templateklasse liefert Fehler
    Von StefanR im Forum PHP
    Antworten: 1
    Letzter Beitrag: 29.11.03, 00:19
  4. Verbesserungsvorschläge
    Von AnonymerSurfer im Forum Photoshop
    Antworten: 3
    Letzter Beitrag: 28.11.01, 23:32