Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
20
ZUGRIFFE
1406
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MaxivB Tutorials.de Gastzugang
    Hallo,

    ich habe eine Template Klasse erstellt:
    PHP-Code:
    class tpl {
        var 
    $file;
        var 
    $output;
        var 
    $between;
        var 
    $r_str_arr;
        var 
    $v_str_arr;
        var 
    $name;
        function 
    tpl($tpl_file ""){
            
    $this->file $tpl_file;
            
    $output '';
            
    $handle fopen ($this->file'r');
            while (!
    feof($handle)){
                
    $buffer fgets($handle4096);
                
    $output .= $buffer;
                }
            
    $this->output $output;
            
    fclose ($handle);
            
    $this->r_str_arr = array();
            
    $this->v_str_arr = array();
            }
        function 
    replace($r_str$v_str) {
            
    $this->output str_ireplace('{'.$r_str.'}'$v_str$this->output);
            }
        function 
    block($name) {
    /* Ich fürhe am anfang diese Funtion aus */
            
    preg_match_all("=\[".$name."\](.*)\[\/".$name."\]=siU"$this->output$this->between);
            
    $this->between $this->between[1][0];
            
    $this->name $name;
            }
        function 
    replace_block($r_str$v_str) {
    /* Dann kommt eine schleife in der index.php und in diese kommt dann beliebig oft diese Funktion reib */
            
    array_push($this->r_str_arr$r_str);
            
    array_push($this->v_str_arr$v_str);
            }
        function 
    exit_block() {
    /* Am ende wird dann außerhalb der schleife dies ausgeführt: */
            
    $r_strs = array();
    // -- Alle zu ersetztenden strings kommen hier in diese foreach-schleife --
            
    foreach ($this->r_str_arr as $test) {
    // -- Es wird der $r_strs nur $test hinzugefügt, wenn es in $r_strs nochnicht drin ist, so kann ich zählen, wie viele replaces in den schleifen eingesetzt wurden --
                
    if (!in_array($test$r_strs)) {
                    
    array_push($r_strs$test);
                    }
                }
    // -- hier wird berechnet, wie oft die schleife ausgefürht wurde (die gesamtzahl der zu ersetztenden strings durch die replaces, die wir geade berechnet hatten --
            
    $count count($this->r_str_arr) / count($r_strs);
            
    $end "";
    // -- Jetzt kommt eine einfache for-schleife --
            
    for ($i 0$i $count$i ++) {
                
    $test = array();
                
    $zutest = array();
                foreach (
    $r_strs as $str) {
    // -- Hier haben wir dann jeden string, der ersetzt werden soll und dann wieder in $test hinzugefügt wird -- 
                    
    array_push($test$str);
                    }
                
    $w $i count($r_strs);
                
    $t count($this->r_str_arr);
                for (
    $r $w$r $w count($r_strs); $r ++) {
    // -- Und hier dann jede ersetztung --
                    
    array_push($zutest$this->v_str_arr[$r]);
                    }
                
    $e = -1;
                
    $content $this->between;
                foreach (
    $test as $j) {
                    
    $e ++;
    // -- Hier wird dann ein str_replace() ausgeführt. --
                    
    $content str_replace("{".$j."}"$zutest[$e], $content);
                    }
    // -- Ab hier wird es hoffentlich verständlich ;)
                
    $end .= $content;
                }
            
    $this->output preg_replace("=\[".$this->name."\](.*)\[\/".$this->name."\]=siU"$end$this->output);
            }
        function 
    display(){
            echo 
    $this->output;
            }
        }
    /* ------------------------------- */
    $tpl = new tpl("./test.txt");
    $tpl->block("test");
    $array = array("nr1""nr2""nr3");
    $c 0;
    foreach(
    $array as $string) {
        
    $c++;
        
    $tpl->replace_block("hallo"$c);
        
    $tpl->replace_block("test"$string);
        
    $tpl->replace_block("halloo""ersetztung");
        
    $tpl->replace_block("ein_test""...");
        }
    $tpl->exit_block();
    $tpl->display(); 
    Das funktioniert auch...
    Nun meine frage: Ich habe das mit dem exit_block() sehr umständlich gemacht... Kann man das noch vereinfachen?
    Geändert von MaxivB (30.12.08 um 11:56 Uhr)
     

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    1.853
    Blog-Einträge
    2
    Ein paar Kommentare im Quelltext bitte. Gibt nur wenige die sich in die komplette Klasse extra einarbeiten möchten um eine Funktion zu verbessern.
    Sven Mintel bedankt sich. 
    Gebe keine Hilfe per PN, Mail, Instant Messenger etc.
    und keine Copy&Paste-Lösungen - ein bisschen selbst nachdenken sollte drin sein. Konstruktivismus 4tw!


    MfG, Zod

    __________________
    rpd Framework: Rapid Web-Engineering in PHP (Manual | Google Code)

  3. #3
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Hallo!
    Also ich weiß nicht... Ich kann mit dieser Klasse im Allgemeinen nichts Anfangen. Der Support von PHP 4 wurde mit dem Release der Version 4.4.9 offiziell eingestellt. Dieser Schritt wurde bereits letztes Jahr angekündigt und sollte mit dem Start der Olympischen Spiele in Bejing zusammenfallen. Ich kann nur empfehlen, dass schnellst möglich alle ihre alten und noch verwendbaren Klassen oder Scripte auf den Stand von PHP5 bringen (ist auch komfortabler). Hier mal eine alternative Klasse mit PHP5.

    PHP-Code:
    <?php

    /***
    * Class Template
    *
    * Template class allows filling templates with life.
    * Sure this class supports also the nesting of
    * different templates. So you can manage superior
    * designs and webpages.
    *  
    * @package Template
    * @version 0.4
    * @author Mauricio Hannika
    * @author Andreas Wilhelm <Andreas2209@web.de>
    * @copyright Mauricio Hannika, Andreas Wilhelm
    **/  
    class Template
    {
        protected 
    $template;
        protected 
    $vars;

        
    /**
        * Constructor - Sets the filename of the template
        *
        * @access public
        * @param Str $template
        * @return Boolean
        */
        
    public function __construct($template)
        {
            if( !
    file_exists($template) || !is_readable($template) )
            {
                throw new 
    Exception('Could not load template file.');
            }  
          
            
    $this->template $template;
        }

        
    /**
        * __get() - Returns the queried value
        *
        * @access public
        * @param Str $key
        * @return String
        */
        
    public function __get($key)
        {
            return isset(
    $this->vars[$key]) ? $this->vars[$key] : '';
        }

        
    /**
        * __set() - Sets the variables
        *
        * @access public
        * @param Str $key
        * @param Str $value
        * @return String
        */
        
    public function __set($key$value)
        {
            if(isset(
    $this->vars[$key]))
            {
                throw new 
    Exception($key ' has already been set.');
            }
          
            
    $this->vars[$key] = $value;
        }

        
    /**
        * parse() - Parses a file and returns it
        *
        * @access public
        * @param Str $path
        * @return String
        */
        
    public function parse($path='')
        {    
            
    ob_start();
            
            if( !@include_once(
    $path) )
            {
                throw new 
    Exception('Failed to parse file.');            
            }
            
            
    $parsed ob_get_contents();
            
    ob_end_clean();
            
            return 
    $parsed;
        }

        
    /**
        * __toString() - Renders the template
        *
        * @access public
        * @return String
        */
        
    public function __toString()
        {  
            return 
    $this->parse$this->template );
        }
    }
    ?>
    Ein Template dazu könnte so aussehen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
     
        <head>            
            <title>&middot; <?= $this->title; ?> &middot;</title>
     
            <meta name="Title" content="<?= $this->title; ?>" />
            <meta name="Author" content="pseudo@mail.de" />
            <meta name="Publisher" content="pseudo.tld" />
            <meta name="Copyright" content="pseudo.tld" />
            <meta name="Revisit" content="After 2 days" />
            <meta name="Keywords" content="pseudo, test, titel, homepage, website" />
            <meta name="Description" content="Besuchen Sie meine Seite! Es k&ouml;nnte sich lohnen." />
            <meta name="Abstract" content="Visit my website. It'll be great." />
            <meta name="Robots" content="INDEX,FOLLOW" />
            <meta name="Language" content="Deutsch" />
            <meta name="Distribution" content="global" />
            <meta http-equiv="content-Type" content="text/html;charset=iso-8859-1" />
            
            <link rel="stylesheet" type="text/css" href="design.css"/>    
        </head>
            
        <body>
            <div id="page">
            
                <h1 id="headline"><?= $this->title; ?></h1>        
                
                <ul id="navigation">
                    <?= $this->navigation; ?>
                </ul>
                
                <div id="content">
                    <?= $this->content; ?>
                </div>                    
                
                <p id="footer">
                    powered by <?= $this->title; ?> © <?= $this->date; ?>                
                </p>
            </div>
        </body>
    </html>
    Die index.php dazu sieht dann so aus:
    PHP-Code:
    <?php
        
    try
        {
            
    // load required classes
            
    require_once('Template.php');
                            
            
    $mysqli = new mysqli('DB_HOST''DB_USER''DB_PWD''DB_NAME');
                
            
    $tpl = new Template('layout.html');
                
            if( empty(
    $_GET['site']) )
            {
                
    $content $tpl->parse('home.html');
            }
                
            elseif( !isset(
    $_GET['site']) || !file_exists($_GET['site']) || !is_readable($_GET['site']) )
            {
                
    $content '<p>Die Seite konnte leider nicht gefunden werden.</p>';
            }
                
            else
            {
                
    $site $_GET['site'];
                
    $content $tpl->parse($site);
            }
            
            
            
    $sql "SELECT
                    *
                FROM
                    navigation
                ORDER BY
                    name"
    ;
            
            
    // send sql-query
            
    if ( $result $mysqli->query($sql) )
            {        
                
    // save result into an array
                
    $navigation '';
                while( 
    $row $result->fetch_assoc() )
                {
                    
    $navigation .= '<li><a href="index.php?site='.$row['id'].'">'.$row['name'].'</a></li>';
                }
            }
            
            else
            {
                
    $navigation '<b>Die Navigation konnte leider nicht geladen werden.</b>';
            }
            
            
    $tpl->title $navigation;
            
    $tpl->navigation $navigation;
            
    $tpl->content $content;
            
    $tpl->date date('Y');
                
            echo 
    $tpl;
        }
            
        catch(
    Exception $e)
        {
            echo 
    '<p>'.$e->getMessage().'</p>';
        }
    ?>
    Denke das ist doch sehr übersichtlich und absolut einfach. Um das ganze noch abszurunden, kann man noch die hässliche URL via mod-rewrite verstecken. Das ganze könnte am Ende dann wie in diesem Beispiel aussehen.
    MfG, Andy
    Geändert von Avedo (28.12.08 um 20:55 Uhr)
    Sven Mintel bedankt sich. 
    Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
    http://www.avedo.net

  4. #4
    splasch splasch ist offline Mitglied Brillant
    Registriert seit
    Jul 2004
    Beiträge
    852
    @Catull

    Du setzt ja wiederum php ein in deinen Template files. Wenn man schon so genau ist und auf php 5 pocht dann sollte man auch wie vorgesehen keinen php code in den Templateflies verwenden. Platzhalter reichen da völlig aus.

    Was mir bei euch beiden in den Klassen fehlt sind ganz einfache Grundfunktionen die immer benötigt werden. Soweit ich gesehen hab können eure Klassen zwar Platzhalter ersetzen ausnahme Catull klasse die Arbeitet mit php befehlen.

    Aber was ist mit Schleifen die werden immer wieder mal gebraucht und ihr habt keine Möglichkeit das in dem Template files umzusetzen ohne wieder php code zu verwenden!

    Ich zeig auch mal meine Templateklasse sie ist zwar auch net besonders und könnte noch weiter Optimiert werden aber sie besitzt zumindestens die Grundlegenden sachen wie eben Schleifen und ersetzen von Platzhaltern sowie das bearbeiten von Verschachtelten Schleifen. Desweitern unterstütz sie das Einbinden von weiteren Templates files was ich bei euch auch nicht endecken konnte.Sowie das einbinden von Kommentaren in den Template files

    Template Klasse
    PHP-Code:
    <?php 
    /**
    * Template Klasse
    * @version 2.1 
    * @author Splasch
    * Filename: Template.php
    * Verschachtelte Templates files
    * Schleifen Loop Funktion
    **/ 
    class Template
    {
       protected 
    $template;  /* Template Inhalt */ 
       
    protected $templateDir;    // Der Ordner in dem sich die Template-Dateien befinden.
       
    protected $loop;        # Array Schleifen füll Werte
       
    public      $liste;       #Lade Reihenfolge der Template Datein
       
    /**
    * Klassen aufruf - Lade Template file von $path
    * @param Str $path
    */
    public function __construct($path '')
    {
     if (
    file_exists($path) == false)
      {
       throw new 
    Exception ('Template File nicht gefunden path: `' $path '`');
      }
     if (
    $tpl file_get_contents($path))
      {
        
    $this->templateDir=dirname($path).DIRECTORY_SEPARATOR#Kombilität zu Linux"\\"
        
    $this->replace($tpl); 
      }
    }

    /**
    * replace() - Ersetzt platzhalter für includierte Files 
    * @param Str $str enthält der Template
    * @return String
    */
    protected function replace($str)
    {
    // Includes ersetzen ( {include="..."} )
     
    $liste=null;
     while(
    preg_match_all("/".'{'."include=\"(.*)\"".'}'."/isUe"$str,$file,PREG_PATTERN_ORDER))
     {
      foreach (
    $file[1] as $datei)
      { 
       try
       {
          
    $file=$this->templateDir.$datei.".tpl";
          
    $liste.=$file.", "#echo $file;
          
    $this->liste=$liste# Für fehler suche Ausgabehilfe
          
    if(file_exists($file) == false)
          { 
           throw new 
    Exception();
           }
       }
       catch(
    Exception $e)
       {
          die(
    "Template File nicht gefunden path:<b>\"".$file."\"</b><br>"
          
    .$e->getFile().$e->getLine().$e->getTraceAsString()
          .
    "<br><b>Ladereihenfolge der Templatefiles: </b>".$liste);
       }
      } 
    // ende foreach
      
    $str preg_replace("/".'{'."include=\"(.*)\"".'}'."/isUe""file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2'.'tpl')"$str);
     } 
    // ende while
     
     
    $this->template=$str;
    }
    /**
     * con - Inhalt Umlaute Sonderzeichen Html Konform umwandeln
     * @param Str $in
     */
    public function con($in)
    {
     
    $suche=array("ä","Ä","ö","Ö","ü","Ü","ß","€");
     
    $ersatz=array("&auml;","&Auml;","&ouml;","&Ouml;","&uuml;","&Uuml;","&szlig;","&euro");    
     
    $in=str_replace ($suche,$ersatz$in);    
     return 
    $in;
    }
    /**
     * set_loop - Inhalt Platzhalter für Schleifen 
     * @param Str $name
     * @param Array $inhalt 
     */
    public function setLoop($name,$inhalt)
    {
     
    $this->loop[$name]=$inhalt;
    }
    /**
     * replace_loop - Loop Schleifen ausführen und Inhalt Ersetzen
     * @param Str $name - Name der Schleife die Ersetzt wird
     * @param Str $in - Inhalt der Html Elemente Innerhalb der Schleife
     */
    protected function replace_loop($name,$in)
    #Umlaute Html komform ersetzen
     
    $in=$this->con($in);
     if (isset(
    $this->loop[$name]) && is_array($this->loop[$name]))
      { 
    $neu=""$str=0;     
       foreach (
    $this->loop[$name] as $key=>$inhalt)
       {  
    $str++;
        foreach(
    $inhalt as $replace)
        { 
         if (
    $str==1){$neu.= preg_replace("/{.$key}/us"$replace$in);}
          Else{
    $neupreg_replace("/{.$key}/Usi"$replace$neu,1);}
        }
       }
       
    $this->template preg_replace("/{loop={$name}}.*{loop=$name end}/Uis""$neu"$this->template);     
      } 
    #ende if isset    
    }

    /**
    * __set() - Ersetze den Platzhalter mit dem Inhalt der Variable $replacement
    * @param Str $placeholder
    * @param Str $replacement
    */
    public function __set($placeholder$replacement)
    {
     
    preg_match("/{loop=(.*)}(.*){loop=\\1 end}/Usie"$this->template$str);  
     if (!empty(
    $str[1])) // Wenn Schleife dann Teile tauschen
     
    {  
      
    $this->replace_loop($str[1],$str[2]); #loop Name und Loop Inhalt übergeben
     
    #ende empty
     
     
    $this->template str_replace('{$'.$placeholder.'}'$replacement$this->template);
     
    # Wenn Include im Template ist neu Parsen
     
    if (preg_match("/".'{'."include=\"(.*)\"".'}'."/isUe"$this->template))
     {
      
    $this->replace($this->template); 
     } 
    //ende preg_match
    //ende Set

    /**
    * getTpl() - Gibt den Template Inhalt zurück
    * @return String
    */
    public function getTpl()
    {
     
    // Kommentare löschen
     
    $str preg_replace("/".'\{\*(.*)\*\}'."/isUe"""$this->template);    
     return 
    $str;
    }

    // Klasse ende
    ?>
    Anwendungs Beispiel hier ein Auzug aus meinen Warenkorb Template file
    PHP-Code:
    {* file Warenkorb.php *}
    {* 
    Wird Angezeig wenn was im Warenkorb ist *}
    <
    table cellpadding="0" cellspacing="0"  align="center" border="0" >
    <
    tr>
    <
    td><b>Warenkorb<br><br></b></td>
    </
    tr>
    </
    table>
    <
    table cellpadding="2" cellspacing="0" align="center"  border="0">
     <
    tr>
      <
    td>
       <
    table cellpadding="2" cellspacing="0"  align="center" bgcolor="#E3F2CC" class="Warenkorb">
        <
    tr>
         <
    td><b>Menge</b></td>
         <
    td
         <
    table width=100% class="Warenkorb_innen">
          <
    tr>
           <
    td><b>Produkt Bezeichnung </b></td>
           <
    td><div align="right"><bArtikelnummer</b></div></td>
          </
    tr>    
         </
    table>
         </
    td>
         <
    td><b>Preis </b></td>
        </
    tr><tr>
        
         {
    loop=produkte}
         <
    td>
          <
    form action="index.php?pos={$pos}&amp;xPos=1&amp;Best={$Best}&amp;E=2&amp;" method="post" target=_self>
          <
    table cellpadding="0" cellspacing="0" border="0" width=100% class="Warenkorb_innen">
           <
    tr
            <
    td nowrap>
             <
    INPUT type="text" name="NeuAnzahl" size="3" value="{$Menge}"><b> {$Mengenart}&nbsp;</b><br>
              <
    a href="index.php?pos={$pos}&amp;xPos=1&amp;Best={$Best}&amp;L=1&amp;" >L&ouml;schen</a>
             </
    td>
             <
    td align="right" valign="top">    
              <
    input class="input" type=submit name="sub" value="&Auml;ndern" style="width:65px"><br>
            </
    td>
           </
    tr>
          </
    table>
          </
    form>
         </
    td>
         <
    td>
          <
    table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
           <
    tr>
            <
    td>{$Prodname}{$std}
            </
    td>
            <
    td>
             <
    div align="right"><font class="blau">&nbsp;&nbsp;&nbsp;{$Artikelnr}</font></div>
            </
    td>
           </
    tr>            
          </
    table>
         </
    td>
         <
    td>
         <
    table cellpadding=0 cellspacing=0 width="100%" class="Warenkorb_innen">
          <
    tr>
           <
    td align="left">&euro;</td>
           <
    td align="right">
            {
    $Zw}<br>
          </
    td>
         </
    tr>
         </
    table>
         </
    td>    
       </
    tr>
       <
    tr>
       {
    loop=produkte end}
        <
    td colspan="2" rowspan="4">
         <
    table cellpadding=3 cellspacing=0 width=100% class="Warenkorb_innen" >
             <
    tr>    
           <
    td><div align="right"><b>Gesamtbetrag</b></div></td>
          </
    tr><tr>
           <
    td><div align="right">MwSt20%</div></td>
          </
    tr><tr>
           <
    td><div align="right">Versandkosten</div></td>
          </
    tr><tr>
           <
    td><div align="right"><b>Endbetrag</b></div></td>
          </
    tr>
         </
    table>
        </
    td>
        <
    td>
         <
    table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
          <
    tr>
           <
    td align="left">&euro;&nbsp;</td>
           <
    td>
            <
    div align="right">{$Summe}</div>
           </
    td>
          </
    tr>
         </
    table>    
       </
    tr>
       <
    tr>
        <
    td>
         <
    table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
          <
    tr>
           <
    td align="left">&euro;&nbsp;</td>
           <
    td>
            <
    div align="right">{$Mwst}</div>
           </
    td>
          </
    tr>
         </
    table>
       </
    tr>
       <
    tr>
        <
    td>
         <
    table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
          <
    tr>
           <
    td align="left">&euro;&nbsp;</td>
           <
    td>
            <
    div align="right">{$Versand}</div>
           </
    td>
          </
    tr>
         </
    table>
       </
    tr>
       <
    tr>
        <
    td>
         <
    table cellpadding=0 cellspacing=0 width=100% class="Warenkorb_innen">
          <
    tr>
           <
    td align="left">&euro;&nbsp;</td>
           <
    td>
            <
    div align="right">{$Endsumme}</div>
           </
    td>   
          </
    tr>
         </
    table>
       </
    tr>
      </
    table>
      </
    td>
     </
    tr>
     <
    tr>
      <
    td>
       <
    form action="index.php?pos={$pos}&amp;xPos=1&amp;Best={$Best}&amp;" method="post" target=_self>
       <
    table cellpadding=0 cellspacing=0  border="0">
        <
    tr>
         <
    td><br>
           <
    b>Lieferland </b>&nbsp;
          <
    select name="land" id="land" onchange="this.form.submit();" style="font-size:13px;font-weight:bold;width:115px">
           <
    option {$selected1value="Deutschland">Deutschland</option>
           <
    option {$selected2value="Österreich">Österreich</option>
          </
    select>
          <
    input class="input" type=hidden name="Zart" value="{$Zart}">
         </
    td
         <
    td align="left"><br>
          <
    b>&nbsp;&nbsp;Zahlung per</b>&nbsp;
          <
    select name="Zart"  onchange="this.form.submit();" style="font-size:13px;font-weight:bold;">
           <
    option {$lieferscheinvalue="Lieferschein">Lieferschein</option>
           <
    option {$vorauskassavalue="Vorauskassa">Vorauskassa</option>
           <
    option {$nachnamevalue="Nachnahme">Nachnahme</option>
          </
    select>                
         </
    td>
        </
    tr>
       </
    table>    
       </
    form>    
      </
    td>        
     </
    tr>            
    </
    table>        
    <
    table cellpadding="2" cellspacing="0" align="center"  border="0">
     <
    tr>
      <
    td align="center">
       <
    br><a href="index.php?pos={$pos}&amp;xPos=14&amp;">Bestellen</a>
      </
    td>
     </
    tr>
    </
    table
    {include=
    "Weiteres_Templatefile"
    Und die Verwendung der Klasse gestalltet sich sehr einfach
    PHP-Code:
    <?
    define 
    ('DIRSEP'DIRECTORY_SEPARATOR);// Für Linux Kompatibele Slash 
    define ('path',dirname(__FILE__).DIRSEP);

    $basisTpl=path."templates"#Basis Template Verzeichniss vorgeben

    // Eine neue Instanz der Template Klasse erzeugen
    $tpl = new Template($basisTpl.DIRSEP.'index.tpl');

    # Beispiel für Schleifen
    # Einfach in der Scheife ein Array erzeugen  das Array könnte dann so ausschauen 
    $korb['Best'][]="Ausgabe1";    
    $korb['Menge'][]="Ausgabe2";    
    $korb['Mengenart'][]="Ausgabe3";    
    // unsw.

    //Array das aus der Schleife erzeugt wurde dem Template übergeben
    $tpl->setLoop("produkte",$korb);

    //Einfaches ersetzen von Platzhaltern
    $tpl->Summe=15;
    $tpl->Versand=8;
    //unsw.

    #Weiter Template files Dynamisch einfügen (einfach Platzhalter durch neues Template file ersetzen)
    $tpl->Endsumme='{include="Filename"}';  #Hier wird die Template datei Filename.tpl reingeladen

    //Augeben der Template 
    echo $tpl->getTpl();
    Das waren oben nur Anwendungs Beispiele um zu Demonstrieren wie man die Klasse Verwendet.
    Die eingefügten Werte ergeben natürlich keinen sin im Zusammenhang des Warenkorb Templatefiles.
    Sie dienen ledig um zu Zeigen wie man die Klasse einsetzen kann und auch wie man Dynamisch weitere Files nachladen kann. Wenn vorher die noch nicht fest stehen.

    Ansonsten könnt ihr gleich ins Templatefile den Platzhalter für Nachladen reinschreiben.

    Mfg Splasch
    Geändert von splasch (29.12.08 um 10:03 Uhr)
     

  5. #5
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    @Splash:
    Ich nutze nur Templates um das Layout wiederverwenden zu können und wirklichen Programmcode vom Template zu trennen. Dir ist hoffentlich klar, dass PHP eine Template-Spreache ist. Es ist praktisch dafür optimal. Und wenn du es so sehen willst ist mein <?= $this->entry; ?> auch nichts anderes als ein Platzhalter. Zudem funktioniert meine Templateklasse um einiges Schneller als deine, da preg_replace() eine ziemlich lahme Funktion ist. Ein absoluter Performance fresser. Deine ganze Klasse ist viel zu vollgestopft. Die Hälfte der Methoden ist überflüssig. Was sollen solche Dinge wie Pseudo-Funktionen wie include? Da kann man in der index-Datei auch die komplette Datei laden und über einen Platzhalter zuweisen. Du willst schleifen in deinem Template? Wieso? Reicht es nicht meinetwegen Daten aus einer Datenbank in einer Schleife zu verarbeiten, die fertig verarbeiteten Daten einem Platzhalter zuzuordnen und fertig? Wozu der ganze Pseudo-Code? Selbes gilt auch für das verschachteln von Templates. Mit parse() das Template aufrufen, dies einem Platzhalter zuordnen und fertig. Und wenn du unbedingt Schleifen und so ein kram in deinen Templates haben musst, bietet dir PHP dafür eine extra Syntax.
    PHP-Code:
            <table class="list" style="width: 95%;">
                <caption>Links</caption>
                <tr>
                    <? while( $field key($row) ): ?> 
                        <th><a href="tabs.php?sort=<?= $field?>&dir=<?= $dir?>"><?= $field?></a></th>
                        <? next($row); ?>
                    <? endwhile; ?>
                </tr>
                <tr>
                    <td><?= implode("</td><td>"$row); ?></td>
                </tr>
                <? while( $row $result->fetch_assoc() ): ?>
                <tr>
                    <td><?= implode("</td><td>"$row); ?></td>
                </tr>
                <? endwhile; ?>
            </table>
    Diese Art der Templateverarbeitung nennt man auch das Template-View Pattern, also ein reguläres Pattern gegen das nichts spricht.
    MfG, Andy
    Geändert von Avedo (29.12.08 um 11:29 Uhr)
     
    Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
    http://www.avedo.net

  6. #6
    splasch splasch ist offline Mitglied Brillant
    Registriert seit
    Jul 2004
    Beiträge
    852
    Schau das ganze sind Ansichtsachen eines jedens. Die Grenzen dabei sind sehr eng beieinander.

    Wenn du nun wieder php mit Hmtl mischt verlierst sich diese Trennung wieder. Bei den einfachen Beispielen mag es noch wenig ausehen aber im Laufe der Entwiklung wirste darauf kommen das allein mit $this nicht getan ist und du wirst weiteren php code einbinden.

    Im endefekt steuerst du damit genau auf das hin was du vermeiden wolltes und zwar das mischen von php und html.

    Jetzt einfach mal Darzustellen ,wenn man nur 1% php einsetz in Templatefiles sei es noch ok sei mal dahin gestellt.
    Wenn man keine 100% Trennung macht wird die Performenc immer besser sein. Aber genauso gut könntes du das Trennen dann auch gleich weg lassen.

    Denn schnell wird in großen Projekten aus dem 1% dann 3% ,5% unsw.

    Man sollte schon bei eindeutigen Sachen bleiben oder eben dafür dann eine neue Defination auslegen.

    Alles eine frage wie man es ausleg:
    Ist ein Moterrad mit 3 Rädern auch noch ein Moterrad oder doch schon eher ein Auto.
    (Und genau da hat man dann dafür wieder einen neuen Namen Definiert)

    Deins entspricht nun mal nicht dem singemässen Vorgaben einer Template. Man könnte dafür eben auch einen neuen Namen definieren zbs. Subtemplate

    Siehe nur dein Beispiel von eben nun sind schon aus 1% php code 3% und mehr geworden!
    table class="list" style="width: 95%;">
    <caption>Links</caption>
    <tr>
    <? while( $field = key($row) ): ?>
    <th><a href="tabs.php?sort=<?= $field; ?>&dir=<?= $dir; ?>"><?= $field; ?></a></th>
    <? next($row); ?>
    <? endwhile; ?>
    </tr>
    <tr>
    <td><?= implode("</td><td>", $row); ?></td>
    </tr>
    <? while( $row = $result->fetch_assoc() ): ?>
    <tr>
    <td><?= implode("</td><td>", $row); ?></td>
    </tr>
    <? endwhile; ?>
    </table>
    Mfg Splasch
    Geändert von splasch (29.12.08 um 11:38 Uhr)
     

  7. #7
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Mein Beispiel war auch nur ein Beispiel. Ich greife auf solche Sytax nur in testumgebungen zurück, um Algorithmen zu testen. Alles PHP lastige lasse ich vor dem einbinden in das Template parsen. Dadurch reichen mir Platzhalter vollkommen. Und für mich ist die Performance sehr wichtig und dass ich die Templates "lesen" kann. Dies ist aber nur solange gegeben, wie ich keinerlei Programmlogik egal ob pseudo oder nicht verwende. Und dies ist auch der Punkt den ich am wenigsten verstehe. Wieso ersetzt man, wenn man für mich unverständlicher weise Programmlogik in einem Template verwendet, diese auch noch durch pseudo Code, der ds ganze nicht lesbarer macht und auch noch die Performance zerstört. Positives kann ich daran nicht finden.
    MfG, Andy
    Geändert von Avedo (29.12.08 um 14:52 Uhr)
     
    Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
    http://www.avedo.net

  8. #8
    Registriert seit
    Mar 2004
    Beiträge
    490
    @MaxivB: Ich stell mich hinter ZodiacXP an: Kannst du ein paar Kommentare oder Erklärungen zu dieser exit_*() Methode schreiben? Da wird soviele gelooped und mit arrays gearbeitet, da muss man sich ja richtig einarbeiten. Ein paar Hilfen wären gut.

    Zu der allgemeinen Thema Templateklasse:
    Puh, da haben wir es ja zum Glück vor dem neuen Jahr nochmal geschafft eine TemplateKlassen Disskussion zu starten

    Ich sehe PHP auch als Templatesprache an und verzichte daher in einer Templatesprache eine Templatesprache zu programmieren.
    Dabei glaube ich auch nicht, das bei der Einführung von PHP5 die Entwickler im Sinn hatten, das man keinen PHP Code in Templatefiles nutzen darf/soll. Allerdings muss ich splasch recht geben, was das Beispiel von Catull angeht. Die MySQL Ressource sollte nicht im Template iteriert werden, vor allem nicht wenn man ein MVC Pattern nutzt, dann gehört es ins "M", mindestens in den "C" aber nicht in "V".
    Die Argumentation der "Definition eines Templates" finde ich nach meiner Ansicht hier nicht passend, denn die Frage ist, auf welcher Basis man die Definitionen aufstellt.
    Ich sehe es zwar auch so, das ein Template nur "Platzhalter" und keine erweiterten Ressourcen beinhalten soll, aber die Basis der Definition von Templates ist hier PHP und diese "HTML embeded scripting language" bietet mir für dieses Thema alles was man brauch, sodass ich keine weitere neu erfundene "Scripting Language" benötige. Es ist vielleicht eine Frage des Glaubens ob man catulls Methode "Subtemplate" nennt oder splaschs Weg "Subscriptingtemplate". Das Argument das ich zuviel PHP Code im Template nutze kann man auch andersrum nutzen. Wer hindert mich, das HTML schon im PHP Code vorbereite und dann nur noch den Platzhalter im Template mit dem HTML Code ersetze.

    Die Performance wird bei Catulls Beispiel ziemlich identisch sein, als würde man den HTML Teil direkt im PHP Code vermischen., wohingegen bei der wirklich strikten Trennung die Performance leidet.
    Ein realitätsnahes Beispiel ist glaube ich die Darstellung einer Tabelle mit Zahlenwerten oder man kann auch die Zeichenkodierung nehmen.
    Lese ich aus einer Datenbank Floats aus, so sind diese in der amerikanischen Notierung (Punkt als Dezimaltrennzeichen) gehalten. Bei der 100% Trennung muss ich nun im "PHP Code" das Array einmal iterieren, damit ich die Darstellung auf die ISO Norm bringe mit einem Komma als Dezimaltrennzeichen. Oder ich will Geldbeträge für Schweizer Besucher darstellen. Hier wird der Punkt als Trennzeichen verwendet, wohingegen bei Nicht-Geldbeträgen wieder das Komma zum einsatz kommt.
    Dieses veränderte Array übergibt man dann an die TPL Scripting Language, iteriere das Array erneut und schreibt die Werte dann entsprechend in das Template.
    Bei der Nutzung von PHP als Templatesprache kann ich die Daten aus der Datenbank als Array oder als PDO Result Object direkt an die TPL Klasse übergeben und bei der Iteration des Arrays oder Objektes die Veränderung durchführen. Das setzt natürlich vorraus das die TPL Klasse oder View Object über Plugins oder als direkte Implementierung dies kann.
    Die Argumentation, das dies die Datenbank direkt machen kann ist korrekt, aber was ist, wenn ich die Daten aus einer Datei kriege oder über einen SOAP Request oder ein anderes externes System?

    Nach soviel Text für die Nutzung von PHP als Templateengine muss ich aber festhalten, das PHP die Möglichkeit bietet beides umzusetzen und es keine strikten Vorgaben gibt und der persönliche Geschmack entscheidet.

    Um zum Abschluss:
    @Catull: die ShortTags werden ab PHP6 deprecated eingestuft
    @splasch: Ein Fahrzeug das 3 Räder hat ist in Deutschland natürlich klar definiert. Sollte das Fahrzeug zwei Vorderräder mit einem gewissen Spurabstand haben und die Bremswirkung auf alle 3 Räder wirken, dann handelt es sich um ein Mehrspurfahrzeug und ein Autoführerschein ist notwendig. So in der Art habe ich es in Erinnerung. Wurde vom ADAC geklärt als der Rollerhersteller Piaggio letztens ein neues 3 rädriges Modell vorgstellt hat
     

  9. #9
    Avatar von Dennis Wronka
    Dennis Wronka Dennis Wronka ist offline Soulcollector
    Registriert seit
    Apr 2002
    Ort
    Hong Kong
    Beiträge
    12.296
    Blog-Einträge
    231
    Zitat Zitat von Mairhofer Beitrag anzeigen
    @Catull: die ShortTags werden ab PHP6 deprecated eingestuft
    Sind sie das nicht schon seit PHP 5(.1/2/irgendwas)?
    Ich fand die Dinger seit jeher schrecklich...

    Und wenn hier schon mit Template-Klassen geworfen wird, ich hab auch eine...
     
    PHP Class Collection - PHP-Klassen fuer PHP 5 (und Teilweise auch fuer PHP 4)
    Updates: Catcher 1.1, FTPConnection 1.2, MultiSQL 1.1, RSS2 1.1, SMTPConnection 1.4
    __________________
    EasyLFS - Hintergrundinformationen, Installationsanleitung, Softwareliste und Download
    EasyLFS Projektthread - Informationen, Status und Diskussion zu meiner Linux-Distribution
    __________________
    Ich bin die Schildkroete, mein Sohn. Ich habe das Universum erschaffen, aber bitte mach mir daraus keinen Vorwurf; ich hatte Bauchschmerzen.
    __________________
    Zitat Zitat von Friedrich Nietzsche
    Man muss noch Chaos in sich haben, um einen tanzenden Stern gebaeren zu koennen.

  10. #10
    Registriert seit
    Mar 2004
    Beiträge
    490
    Mir kommt gerade in den Sinn, das ich vermutlich die Short Tags mit den ASP Tags verwechsle.
     

  11. #11
    MaxivB Tutorials.de Gastzugang
    Danke für die vielen Antworten...
    Habe mir aber überlegt das gleich in der index.php mit str_replace() zu machen.
    Ist ja im prinzip genauso.

    Habe aber trotzdem ein paar Erklärungen hinzugefügt
    Geändert von MaxivB (30.12.08 um 12:00 Uhr)
     

  12. #12
    campari campari ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    267
    Was mir unklar bleibt, warum preg_replace immer als performance-Fresser dargestellt wird. Konnte das noch nie nachvollziehen.
    Hab grad mal spasseshalber einen durchschnittlichen 10KB-Text mit preg_replace, preg_match_all und str_replace durchsuchen und ersetzen lassen. str_replace ist bei 1000 Durchgängen grade mal 3 Hunderstel Sekunden schneller. Also was spricht vom Standpunkt der Perfomance dagegen?
     

  13. #13
    Avatar von Avedo
    Avedo Avedo ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Göttingen
    Beiträge
    387
    Zitat Zitat von campari Beitrag anzeigen
    10KB-Text mit preg_replace, preg_match_all und str_replace durchsuchen und ersetzen lassen.
    Super, ganz clever. Wieso bringt uns dieser Vergleich rein garnichts. Weil du zum Parsen eines Layouts, dass die PHP Layoutspracheeigenschaften verwendet, keine dieser drei Funktionen brauchst. Es wird einer Variable ein Inhalt zugewiesen und der Inhalt dieser Variable im Layout ausgegeben. Das geht deutlich schneller, als im Layout nach einem Wort zu suchen und dieses zu ersetzen. Noch schlimmer wird das ganze, wenn du nach Pseudo Code im Quelltext suchen musst. Steht aber auch alles nochmal in Mairhofer's Beitrag. Nur lesen.
    MfG, Andy
     
    Association for Valid wEb DevelOpment - Informatik, Programmierung & Webdesign
    http://www.avedo.net

  14. #14
    Registriert seit
    Mar 2004
    Beiträge
    490
    @maxivB
    Also die Kommentare waren jetzt nicht wirklich hilfreich Ich denke aber das Problem mit dem Verständnis des Ablaufes liegt daran, das du manche einfache Dinge sehr kompliziert umsetzt.
    Zum Beispiel das erstellen des Arrays $r_strs in exit_block(), wo du, wenn ich das richtig verstehe, nur ein array_uniq() umsetzt über eine FOREACH Schleife. Und das könntest du bereits in der Methode replace_block() erledigen, indem du nicht via array_push() einfach alles reinschiebst.

    Ich habe versucht deine Klasse und besonders die exit_block() Methode zu verstehen. Ich habe versucht es nachzuprogrammieren, aber ich kapier es nicht.

    Warum kannst du einen Platzhalter mit einem Wert für einen Block mehrfach belegen? In deinem Beispiel belegst du den Platzhalter "hallo" mehrfach mit den Werten von $c.
    Dann berechnest du aus den mit replace_block() zugeordneten Ersetzungen irgendwas. Und mit dem irgendwas fängst du dann das ersetzen an und zwar genau "irgendwas/irgendwasanderes" mal.

    Wie du merkst ich steig da leider noch nicht hinter.
     

  15. #15
    campari campari ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    267
    Zitat Zitat von Catull Beitrag anzeigen
    Super, ganz clever.
    MfG, Andy
    Meinetwegen, dann vergleich halt das Ersetzen von Pseudo-Platzhaltern anhand einer preg-Funktion mit der direkten Variablenausgabe im Template. Klar, besteht ein Unterschied, aber nicht dein postulierter "absoluter Performance fresser".
     

Ähnliche Themen

  1. Prob mit template klasse!!
    Von Headymaster im Forum PHP
    Antworten: 3
    Letzter Beitrag: 21.10.06, 22:12
  2. Antworten: 6
    Letzter Beitrag: 08.06.06, 20:49
  3. template Klasse ableiten?
    Von Squeegee im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 29.12.05, 17:37
  4. Template Klasse
    Von HolgerX im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 30.03.05, 17:05
  5. Klasse/Template
    Von Fluctuator im Forum PHP
    Antworten: 2
    Letzter Beitrag: 11.02.03, 18:38