[erledigt]schleifen in template ersetzen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

[erledigt]schleifen in template ersetzen

Beitrag 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.
Zuletzt geändert von Ambience am 28.08.2009 10:29, insgesamt 1-mal geändert.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Re: schleifen in template ersetzen

Beitrag 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.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Re: [erledigt]schleifen in template ersetzen

Beitrag 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}
Antworten

Zurück zu „Coding & Technik“