
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.');
}
}
}
?>
<?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.