cos w desen smarty , duzo prostsze i zdecydowanie szybsze w dzialaniu ( przy wlaczeniu cacheowania ) , ma kilka niedogodnien ale mozna latwo rozbudowac, chcialbym zebyscie powiedzieli co mozna ulepszyc i poprawic
<?php
/**
* Mini system templatow
* @author ergo
* @version 1.6
* @access public
* @copyright Marcin Lulek
*/
class template {
/**
* katalog w ktorym znajduja sie templaty
*
* @var string
*/
var $katalog;
/**
* katalog w ktorym zapisywac się będzie cache
*
* @var string
*/
var $katalog_cache;
/**
* przestrzen zmiennych dostepna dal templata (+zmienna globalna $lang)
*
* @var array
*/
var $zmienne;
/**
* czy ma kompilowac templaty
*
* @var boolean
*/
var $kompiluj;
/**
* parsuje i wyswietla zadanego templata na wyjsciu
*
* @param string $wejscie
*/
function wyswietl($wejscie) {
/**
* zwracamy zmienne tak aby sie wygodnie wstawialo je do templata
*/
if(!empty($this->zmienne)){ foreach ($this->zmienne as $key=>$zmienna){
$$key=$zmienna;
}
}
$this->zmienne=NULL;
$this->parsuj($wejscie);
if ($this->katalog_cache . $wejscie . '.php') {
/**
* includujemy templata
*/
include ($this->katalog_cache . $wejscie . '.php');
} else {
die('templat nie istnieje'); }
}
/**
* przypisywaniee zmiennych aby weszly w zasieg klasy parsera
*
* @param string $nazwa
* @param mixed $wartosc
*/
function przypisz($nazwa, $wartosc) {
$this->zmienne[$nazwa] = $wartosc;
}
/**
* wewnetrzna funkcja parsujaca templata
*
* @return string
*/
function parsuj($wejscie) {
/*
* czy mamy kompilowac?
*/
if ($this->kompiluj == TRUE || !file_exists($this->katalog_cache . $wejscie . '.php')) { /**
* otwieramy handlery dla plikow do oczytu i zapisu
*/
/**
* zamieniamy tagi templatow (podobne do smarty - prostsze i mniej obciazajace) na kod php kolejnosc przechodzenia przez tablice JEST wazna
*/
$replacements = array (); /**
* wyrzucanie zmiennych przez echo i var_dump
*/
$patterns[] = '/<?php.*?>/i';
$replacements[] = NULL;
$patterns[] = '/{ *$([^{}]*) *}/i';
$replacements[] = '<?php echo 1; ?>';
/**
* skladnia for
*/
$patterns[] = '/{ *for[ *](.*?) *nazwa=([^}]*) *}/i';
$replacements[] = '<?php $i_2=0;for (1) {$i_2++; ?>';
$patterns[] = '/{ */for *}/';
$replacements[] = '<?php } ?>';
/**
* skladnia foreach
*/
$patterns[] = '/{ *foreach *$(.*?) *nazwa=([^}]*) *}/i';
$replacements[] = '<?php $i_2=0; if (!empty($1)) {foreach($1 as $2){ $i_2++;?>';
$patterns[] = '/{ */foreach *}/i';
$replacements[] = '<?php }} ?>';
/**
* skladnia if
*/
$patterns[] = '/{ *if *([^}]*?) *}/i';
$replacements[] = '<?php if(1) { ?>';
$patterns[] = '/{ */if *}/i';
$replacements[] = '<?php } ?>';
/**
* elseif
*/
$patterns[] = '/{ *elseif *([^}]*?) *}/i';
$replacements[] = '<?php } elseif (1) { ?>';
$patterns[] = '/{ */if *}/i';
$replacements[] = '<?php } ?>';
/**
* else
*/
$patterns[] = '/{ *else *}/i';
$replacements[] = '<?php } else { ?>';
/**
* wlasna wersja cycle do zmian wartosci danego elementu przy iteracji
*/
$patterns[] = '/{ *cycle='(.*?)' nazwa=(.*)}/i';
$replacements[] = '<?php $cykl=array(1); if(!isset($i_2) || $i_2>=count($cykl)){$i_2=0;} echo $cykl[$i_2];$i_2++;?>';
/**
* includy
*/
preg_match_all('/{ *include *([^}]*) *}/i',$zawartosc_templata,$pliki_do_parsowania); foreach ($pliki_do_parsowania[1] as $plik_do_parsowania){
$this->parsuj($plik_do_parsowania);
}
$patterns[] = '/{ *include *([^}]*) *}/i';
$replacements[] = '<?php include(''.$this->katalog_cache.''.str_replace('..',NULL,'.''1')'.'.'.php'); ?>';
$parsed_templat = preg_replace($patterns, $replacements, $zawartosc_templata ); /**
* zapisujemy templata
*/
$handle = fopen($this->katalog_cache . $wejscie.'.php', 'wb'); if (fwrite($handle, $parsed_templat) === FALSE) { die('blad_kompilacji_templata'); }
} else {
die('blad katalogow cache'); }
}
}
}
$tpl = new template;
$tpl->katalog=TEMPLATE;
$tpl->katalog_cache=TEMPLATE_CACHE;
$tpl->kompiluj=KOMPILUJ_CACHE;
?>
tagi:{foreach $zmienna nazwa=element}{/foreach}
{for warunek nazwa=element}{/for}
{if warunek}{elseif warunek}{else}{/if}
{$$zmienna} - echo
{cycle='param1,param2,param3,..' nazwa=sekcja}
{include plik}
{vardump $zmienna}
system dziala duzo szybciej niz smarty dla wlaczonego cacheowania.
UPDATE ver. 1.8
Ten post edytował ergo 6.07.2006, 09:50:02