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
bim2
post 20.07.2006, 09:55:25
Post #2





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Ehh ale zauważ że to nie działa jak niektóe klasy teplatek. To zamienia poprostu wystapienia np. {foreac} na <? foreach() ?> i zaisuje i inlcuduje. Wiesz poco? Poto aby to się wykonało (ie podoba mi się takie podejście, wole nie php dla template bo zaśmiea tlkyo i jest ukryte pod cachowaniem) Ja robie na wyrażeniach regularnych biggrin.gif ale nie na tej zasadzie^^ Tylkot tpl bez pseudo cache


--------------------
Go to the top of the page
+Quote Post
Rafiki
post 20.07.2006, 15:42:57
Post #3





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

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


Cytat(bim2 @ 20.07.2006, 08:55 ) *
Ehh ale zauważ że to nie działa jak niektóe klasy teplatek. To zamienia poprostu wystapienia np. {foreac} na <? foreach() ?> i zaisuje i inlcuduje. Wiesz poco? Poto aby to się wykonało (ie podoba mi się takie podejście, wole nie php dla template bo zaśmiea tlkyo i jest ukryte pod cachowaniem) Ja robie na wyrażeniach regularnych biggrin.gif ale nie na tej zasadzie^^ Tylkot tpl bez pseudo cache


No to zes zrobil odkyrcie ze includuje akurat po to aby szablon sie wykonal (; w sensie wyswietlil winksmiley.jpg

Przeczytaj jeszcze raz to co ja napisalem a moze zrozumiesz ze wyswietlenie sparsowanego szablonu bedzie szybsze jezeli zamiast includoweac plik cachu otworzy go zapomoca file_get_contents ( przypisujac go do jakiejs zmiennej a nastepnie wyswietlali go ).

Ten post edytował Rafiki 20.07.2006, 15:44:19
Go to the top of the page
+Quote Post
ergo
post 7.08.2006, 22:25:30
Post #4





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

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


Cytat(Rafiki @ 20.07.2006, 14:42 ) *
No to zes zrobil odkyrcie ze includuje akurat po to aby szablon sie wykonal (; w sensie wyswietlil winksmiley.jpg

Przeczytaj jeszcze raz to co ja napisalem a moze zrozumiesz ze wyswietlenie sparsowanego szablonu bedzie szybsze jezeli zamiast includoweac plik cachu otworzy go zapomoca file_get_contents ( przypisujac go do jakiejs zmiennej a nastepnie wyswietlali go ).


sluchajcie , cala idea tego, polega na tym zeby z templata dostac wynikowy kod php, zapisac go, i tyle. dostajemy na wyjsciu dokladnie to samo jakbysmy w ogole nie uzyli templata tylko klasycznie mieszali php z html, jak by nie patrzec jest to chyba najszybsze z mozliwych rozwiazan. potem przy ponowmym wyswietleniu zupelnie pomijamy caly proces parsowania i includujemy najzwyklejszy plik php. ktory juz ma na miejscu tagow, liczniki, petle itp itede.... nie bardzo rozumiem idei wczytywania tego do zmiennej zeby wyswietlic ? da sie tak ? przeciez by trzeba bylo eval uzyc ....

jedyne w czym bym prosil o pomoc to podsuniecie pomyslu zeby to robilo tak ze niektore tagi zamiast zamieniac na echo, od razu zamienialo na tekst, np. pliki jezykowe, dzieki temu np. przy wylaczonej kompilacji nie trzeba by wczytywac plikow ze zdefiniowanym tekstem tylko od razu wyrzucac zlokalizowanego templata...


--------------------
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: 20.06.2025 - 00:05