[ Stol3x @ 31.07.2013. 13:33 ] @
Pozdrav svima

Imam problem. Imam klasu za template engine koji koristim na sajtu i do sad me sluzio donekle dobro dok nisam poceo koritit loop.

Zelim loop izvesti u html fajlu te kroz neki html kod: [loop:list_users] [id] [endloop] recimo ispisat sve ID-ove korisnika u bazi.
To radim preko preg_replace tako sto moju varijablu zamjenim svojim kodom, a problem je sto u klasi zamjenjujem kod. Da bi definirao varijablu kao [id] ili [username] moram napraviti $template = new Template; te $template->assign('username',$value');

Posto se unutar klase Template radi obrada varijabli to je nemoguce, renderira varijablu kroz klasu Template samu u sebi..
Evo moj kod:
Code:

<?php

class Template {
    private $vars = array();
    
    public function assign($key, $value = null){
        $this->vars[$key] = $value;
    }
    
    public function render($template_name){
        
        $path = 'templates/default/'.$template_name.'.html';

        if(file_exists($path)){
            $contents = file_get_contents($path);
            
            foreach($this->vars as $key => $value){
                $contents = preg_replace('/\['.$key.'\]/', $value, $contents);
            }
            $site_theme = 'default';
            // HTML funkcije
            $contents = preg_replace('/\<\!\-\- if (.*) \-\-\>/', '<?php if($1) : ?>', $contents);
            $contents = preg_replace('/\<\!\-\- else \-\-\>/', '<?php else : ?>', $contents);
            $contents = preg_replace('/\<\!\-\- endif \-\-\>/', '<?php endif; ?>', $contents);
            $contents = preg_replace('/\<\!\-\- include:(.*) \-\-\>/', '<?php include "templates/$site_theme/$1"; ?>', $contents);
            $contents = preg_replace('/\[notif\]/', '', $contents);
            $contents = preg_replace('/\[login_errors\]/', '', $contents);
            $contents = preg_replace('/\[join_errors\]/', '', $contents);
            $contents = preg_replace('/\[err_forgot_pw\]/', '', $contents);
            $contents = preg_replace('/\<\!\-\- is_logged \-\-\>/', '<?php logged() ? include "templates/'.$site_theme.'/logged.html" : logged(); ?>', $contents);
            $contents = preg_replace('/\<\!\-\- not_logged \-\-\>/', '<?php logged() ? : include "templates/'.$site_theme.'/unlogged.html"; ?>', $contents);
            $contents = preg_replace('/\<\!\-\- loop:user_list \-\-\>/', '<?php $user_select = mysql_query("SELECT * FROM users"); while($usr = mysql_fetch_assoc($user_select)): $user_id = $usr[\'id\']; $template->assign("id", $user_id); ?>', $contents);
            $contents = preg_replace('/\<\!\-\- endloop \-\-\>/', '<?php endwhile; ?>', $contents);
            // Kraj HTML funkcija
            
            // Nije bitno zasto je ovako, al' bitno je da radi, nije bitno zasto radi
            eval(' ?> '.$contents. ' <?php '); 
            
        } else {
            // What if i told you template don't exist?
            exit('template path ne postoji.');
        }
        
    }
    
}

?>


Do sada sam radio tako da u include.php tj. headeru svake stranice pokrenem klasu, assign-am varijable i renderiram template na kraju. Ovdje tako ne mogu jer je to sve u klasi, ako me razumijete.
[ Nemke_BG @ 04.08.2013. 21:27 ] @
Ja da sam na tvom mestu, izbegao bi modifikaciju tvog template engine i implementirao bi neki od vec postojecih, dobro oprobanih i testiranih tpl engine-a.
[ Stol3x @ 04.08.2013. 21:31 ] @
Tako sam i napravio... Uzeo sam RainTPL i prilicno sam zadovoljan :)