Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [klasa] prosta klasa templatow
ergo
post 4.07.2006, 12:53:36
Post #1





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 8.03.2005

Ostrzeżenie: (0%)
-----


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

  1. <?php
  2. /**
  3.  * Mini system templatow
  4.  * @author ergo
  5.  * @version 1.6
  6.  * @access public
  7.  * @copyright Marcin Lulek
  8.  */
  9. class template {
  10. /**
  11.  * katalog w ktorym znajduja sie templaty
  12.  *
  13.  * @var string
  14.  */
  15. var $katalog;
  16. /**
  17.  * katalog w ktorym zapisywac się będzie cache
  18.  *
  19.  * @var string
  20.  */
  21. var $katalog_cache;
  22. /**
  23.  * przestrzen zmiennych dostepna dal templata (+zmienna globalna $lang)
  24.  *
  25.  * @var array
  26.  */
  27. var $zmienne;
  28. /**
  29.  * czy ma kompilowac templaty
  30.  *
  31.  * @var boolean
  32.  */
  33. var $kompiluj;
  34. /**
  35.  * parsuje i wyswietla zadanego templata na wyjsciu
  36.  *
  37.  * @param string $wejscie
  38.  */
  39. function wyswietl($wejscie) {
  40. /**
  41.  * zwracamy zmienne tak aby sie wygodnie wstawialo je do templata
  42.  */
  43. if(!empty($this->zmienne)){
  44. foreach ($this->zmienne as $key=>$zmienna){
  45. $$key=$zmienna;
  46. }
  47. }
  48. $this->zmienne=NULL;
  49. $this->parsuj($wejscie);
  50. if ($this->katalog_cache . $wejscie . '.php') {
  51. /**
  52.  * includujemy templata
  53.  */
  54. include ($this->katalog_cache . $wejscie . '.php');
  55. } else {
  56. die('templat nie istnieje');
  57. }
  58. }
  59. /**
  60.  * przypisywaniee zmiennych aby weszly w zasieg klasy parsera
  61.  *
  62.  * @param string $nazwa
  63.  * @param mixed $wartosc
  64.  */
  65. function przypisz($nazwa, $wartosc) {
  66. $this->zmienne[$nazwa] = $wartosc;
  67. }
  68. /**
  69.  * wewnetrzna funkcja parsujaca templata
  70.  *
  71.  * @return string
  72.  */
  73. function parsuj($wejscie) {
  74.  
  75. /*
  76. * czy mamy kompilowac?
  77. */
  78. if ($this->kompiluj == TRUE || !file_exists($this->katalog_cache . $wejscie . '.php')) {
  79. if (is_dir($this->katalog) && is_dir($this->katalog_cache) && is_writable($this->katalog) && is_writable($this->katalog_cache)) {
  80. /**
  81.  * otwieramy handlery dla plikow do oczytu i zapisu
  82.  */
  83. $zawartosc_templata=file_get_contents($this->katalog . $wejscie);
  84. /**
  85.  * zamieniamy tagi templatow (podobne do smarty - prostsze i mniej obciazajace) na kod php kolejnosc przechodzenia przez tablice JEST wazna 
  86.  */
  87. $patterns = array ();
  88. $replacements = array ();
  89. /**
  90.  * wyrzucanie zmiennych przez echo i var_dump
  91.  */
  92. $patterns[] = '/<?php.*?>/i';
  93. $replacements[] = NULL;
  94. $patterns[] = '/{ *$([^{}]*) *}/i';
  95. $replacements[] = '<?php echo 1; ?>';
  96. /**
  97.  * skladnia for
  98.  */
  99. $patterns[] = '/{ *for[ *](.*?) *nazwa=([^}]*) *}/i';
  100. $replacements[] = '<?php $i_2=0;for (1) {$i_2++; ?>';
  101. $patterns[] = '/{ */for *}/';
  102. $replacements[] = '<?php } ?>';
  103. /**
  104.  * skladnia foreach
  105.  */
  106. $patterns[] = '/{ *foreach *$(.*?) *nazwa=([^}]*) *}/i';
  107. $replacements[] = '<?php $i_2=0; if (!empty($1)) {foreach($1 as $2){ $i_2++;?>';
  108. $patterns[] = '/{ */foreach *}/i';
  109. $replacements[] = '<?php }} ?>';
  110. /**
  111.  * skladnia if
  112.  */
  113. $patterns[] = '/{ *if *([^}]*?) *}/i';
  114. $replacements[] = '<?php if(1) { ?>';
  115. $patterns[] = '/{ */if *}/i';
  116. $replacements[] = '<?php } ?>';
  117. /**
  118.  * elseif
  119.  */
  120. $patterns[] = '/{ *elseif *([^}]*?) *}/i';
  121. $replacements[] = '<?php } elseif (1) { ?>';
  122. $patterns[] = '/{ */if *}/i';
  123. $replacements[] = '<?php } ?>';
  124. /**
  125.  * else
  126.  */
  127. $patterns[] = '/{ *else *}/i';
  128. $replacements[] = '<?php } else { ?>';
  129. /**
  130.  * wlasna wersja cycle do zmian wartosci danego elementu przy iteracji
  131.  */
  132. $patterns[] = '/{ *cycle='(.*?)' nazwa=(.*)}/i';
  133. $replacements[] = '<?php $cykl=array(1); if(!isset($i_2) || $i_2>=count($cykl)){$i_2=0;} echo $cykl[$i_2];$i_2++;?>';
  134. /**
  135.  * includy
  136.  */
  137. preg_match_all('/{ *include *([^}]*) *}/i',$zawartosc_templata,$pliki_do_parsowania);
  138. foreach ($pliki_do_parsowania[1] as $plik_do_parsowania){
  139.  
  140. $this->parsuj($plik_do_parsowania);
  141. }
  142. $patterns[] = '/{ *include *([^}]*) *}/i';
  143. $replacements[] = '<?php include(''.$this->katalog_cache.''.str_replace('..',NULL,'.''1')'.'.'.php'); ?>';
  144. $parsed_templat = preg_replace($patterns, $replacements, $zawartosc_templata );
  145. /**
  146.  * zapisujemy templata
  147.  */
  148.  
  149. $handle = fopen($this->katalog_cache . $wejscie.'.php', 'wb');
  150. if (fwrite($handle, $parsed_templat) === FALSE) {
  151. die('blad_kompilacji_templata');
  152. }
  153. } else {
  154. die('blad katalogow cache');
  155. }
  156. fclose($handle);
  157. }
  158. }
  159. }
  160. $tpl = new template;
  161. $tpl->katalog=TEMPLATE;
  162. $tpl->katalog_cache=TEMPLATE_CACHE;
  163. $tpl->kompiluj=KOMPILUJ_CACHE;
  164. ?>


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


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Rafiki
post 19.07.2006, 20:23:59
Post #2





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 29.12.2005
Skąd: Z krzaków

Ostrzeżenie: (0%)
-----


Zamiast includowac szablon wez go wczytaj do zmiennej otwierajac go np za pomoca file_get_contents(); a nastepnie wyswietl go, takie rozwiazanie bedzie wydajniejsze nizeli includowanie.

Nie wiem czy dobrze zauwazylem bo przegladalem kod tak na szybko, ale wydaje mi sie ze jest to tak skonstruowane ze za pierwszym razem gdy sie wyswietla szablon, jest on parsowany, zapisywany juz jako cache i dopiero wtedy wyswietlany jest szablon z zapisanego cache'u. Nie lepiej bedzie go wyswietlic odrazu po sparsowaniu a dopiero pozniej zapisac ( wtedy wynik sparsowanego szablony powinien nam sie szybciej ukazac ) A pozniej juz normalnie odczytywac wciaz z cache'u ?

Ten post edytował Rafiki 19.07.2006, 20:29:45
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 00:28