Jak na razie wszystko działa - szablony się poprawnie kompilują i poprawnie są wyświetlane
Aktualnie zrobiona jest obsługa
{$zmienna},
{if $warunek}(...){elseif $warunek2}(...){else}(...){/if},
{foreach $instrukcja} (...) {/foreach}
oraz includowanie innych plików szablonu
<?php
class template {
private $compileDir;
private $templateDir;
private $variables = Array();
public function setCompileDir($dir) {
$src = substr($dir, -1);
$src == "/" ? $this->compileDir = $dir : $this->compileDir = $dir."/";
}
public function setTemplateDir($dir) {
$src = substr($dir, -1);
$src == "/" ? $this->templateDir = $dir : $this->templateDir = $dir."/";
}
public function assign($name, $value) {
$this->variables[$name] = $value;
}
public function assigns($value) {
if(is_array($value)) {
foreach($value as $key => $result) {
self::assign($key, $result);
}
}
}
private function includeFile($file) {
foreach($this->variables as $key=>$result) {
$$key = $result;
}
if(file_exists($this->compileDir."template.".$file.".php")) {
require_once($this->compileDir."template.".$file.".php");
} else {
self::compile($file);
}
}
private function compile($tpl_file) {
$content = file_get_contents($this->templateDir.$tpl_file);
if(!empty($content)) {
$content = preg_replace("#{include file=\"(.*)\"}#", "<?php self::includeFile('$1') ?>", $content);
$content = preg_replace("#{if (.*)}#", "<?php if($1) { ?>", $content);
$content = preg_replace("#{else}#", "<?php } else { ?>", $content);
$content = preg_replace("#{elseif (.*)}#", "<?php } elseif($1) { ?>", $content);
$content = preg_replace("#{/if}#", "<?php } ?>", $content);
$content = preg_replace("#{foreach (.*)}#", "<?php foreach($1) { ?>", $content);
$content = preg_replace("#{/foreach}#", "<?php } ?>", $content);
$content = preg_replace("#{(.*)}#", "<?php echo $1 ?>", $content);
$header = '
<?php
$MD5_FILE = "'.md5_file($this->templateDir.$tpl_file).'";
?>
';
file_put_contents($this->compileDir."template.".$tpl_file.".php",$header.$content);
self::display($tpl_file);
} else {
trigger_error("Cannot get information from tpl file", E_USER_ERROR);
die();
}
}
public function display($tpl_file) {
if(!file_exists($this->templateDir.$tpl_file)) {
trigger_error("Template file does not found in ".$this->templateDir.$tpl_file, E_USER_ERROR);
die();
}
if(file_exists($this->compileDir."template.".$tpl_file.".php")) {
foreach($this->variables as $key=>$result) {
$$key = $result;
}
require_once($this->compileDir."template.".$tpl_file.".php");
if($MD5_FILE != md5_file($this->templateDir.$tpl_file)) {
@unlink($this->compileDir."template.".$tpl_file.".php");
self::compile($tpl_file);
}
} else {
self::compile($tpl_file);
}
}
}
?>