Seite 1 von 1

[erledigt]schleifen in template ersetzen

Verfasst: 27.08.2009 22:43
von Ambience
Hallo Liebe Community,

ich schreibe gerade an einem gästebuch mit eigener Template engine. Soweit funktioniert alles, aber jetzt möchte ich gerne schleifen ersetzen lassen bzw. ausführen lassen...

Wie z.b.

Code: Alles auswählen

{foreach smilies as smilie}
<img src="{smilie.img}.jpg"><br />
{/foreach}
Leider habe ich keinen ansatz noch weis ich welche funktionen ich brauche. Meine fragen daher wären, welche funktionen brauche ich dafür bzw. hat jemand einen code teil der eine solche schleife parst`?

Mein template parser ist bis jetzt sehr simple:

Code: Alles auswählen

public function display($template)
  {
        $code = implode('', file($this->template_path . $template . '.html'));           
        $code = str_replace('\\', '\\\\', $code);
        $code = str_replace('\'', '\\\'', $code);
        $code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '\' . ( ( isset($this->assigns[\'\1\']) ) ? $this->assigns[\'\1\'] : \'\' ) . \'', $code);
        
        eval("echo '$code';");
        return true;
  }
Ich habe auch gegooglet, aber leider finde ich nur foren in denen auf fertige engines hingewiesen wird oder es wird unkommentierter code hingeklatsch mit dem ich nicht zurechtkomme. Ich wäre sehr dankbar für ein bisschen brainstorming, evtl. nützliche funktionsnamen oder gute beispiele. Ich hänge an dem problem schon seit tagen und daher geht bei mir nix voran, weil ich nie wirklich viel mit regexp gemacht habe und das rächt sich jetzt.

Ich wünsche einen schönen Abend und hoffentlich auf viele nützliche antworten.

Re: schleifen in template ersetzen

Verfasst: 27.08.2009 23:39
von Ambience
soweit bin ich jetzt schon:

Code: Alles auswählen

//
        // ersetzen einer foreach schleife
        //
        // finden der foreach schleifen
        preg_match_all('#\{foreach from\=(.*?) item\=(.*?)\}(.*?)\{\/foreach\}#s',  $code,  $ausgabe);
        
        //
        // ausenrum der foreach schleife ersetzen
        //
        $code = preg_replace('#\{foreach from\='.$ausgabe[1][0].' item\='.$ausgabe[2][0].'\}'.$ausgabe[3][0].'\{\/foreach\}#s', '\'. foreach($test as $test){ecoh "lol";} . \'', $code);

Ich glaube ich hab den völlig falschen weg.

Re: [erledigt]schleifen in template ersetzen

Verfasst: 28.08.2009 10:30
von Ambience
Habs nun so gelöst:

PHP classe:

Code: Alles auswählen

public function loop_content($name, $string)
{

    $array = $this->assigns[$name];
    print_r($array);
    
    $output = '';
    
    $string = stripslashes($string); // Kleiner Fix für den String
    
    foreach($array as $rows) { // Hier geht er den Datenarray durch
        
        $string_tmp = $string; // Clone von $string, damit $string nicht überschrieben wird
        
        foreach($rows as $row) { // Einzelne Objekte werden durchgegangen
            /*
            Hier werden Werte à la {$name.key} mit den entsprechenden Werten aus dem Array ersetzt
            */
            $string_tmp = str_replace('{'.$name.".".key($rows).'}', $row, $string_tmp);
           next($rows);    
        }
        
        $output .= $string_tmp;
    }

    return $output;
    
}  
  
  public function display($template)
  {
        $code = implode('', file($this->template_path . $template . '.html'));           
        $code = str_replace('\\', '\\\\', $code);
        $code = str_replace('\'', '\\\'', $code);
        $code = preg_replace('#\{([a-z0-9\-_]*?)\}#is', '\' . ( ( isset($this->assigns[\'\1\']) ) ? $this->assigns[\'\1\'] : \'\' ) . \'', $code);

        $code = preg_replace("/".'\{foreach (.*)}'."(.*)".'\{\/foreach\}'."/isUe", '$this->loop_content(\'\1\', \'\2\')', $code);
        
        eval("echo '$code';");
        return true;
  }
}
und die tpl looks like:

Code: Alles auswählen

{foreach smilie}
<img src="images/smilies/{smilie.smile_url}" /><br />
{/foreach}