Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa] prosta klasa templatow
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
ergo
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
NetJaro
Mi się wydaje, że nie ten dział.
Nic dziwnego, że szybsze niż Smarty skoro ma małe możliwości. Bastion stworzył wspaniały system szablonów o możliwościach jak Smarty a o wiele szybszym działaniu smile.gif
ergo
ja wiem czy takie male mozliwosci ?

pozwala zagniezdzac szablony w szablonach, pozwala na wykonywanie funkcji na zmiennych, posiada standardowe konstrukcje jezykowe typu warunki i petle, posiada chacheowanie sparsowanego pliku ( samo php wygenerowane z tpl), dla szybkosci, no i posiada konstukcjie {cycle} ze smarty bo mi sie czesto przydawala i wspiera liczniki dla wszystkich petli. w zasadzie przejscie z kilku systemow pisanych na smartach nie jest wlasciwie zadnym problemem, ( w wiekszosci trzeba troche tlyko sladnie bylo pozmieniac ).

czy malo mozliwosci rzecz gustu, wg. mnie robi to co powinien robic system szablonow ;-) po prostu zrezygnowalem z glupot typu filtry itp :]
ActivePlayer
Przenosze do "algorytmy, klasy, funkcje"
ergo
zupelnie przemodelowalem dzialanie klasy , powinna dzialac jeszcze szybciej, dopisalem jak wygladaja tagi reszty sie chyba mozna juz dopmyslic z kodu.


Cytat(ergo @ 5.07.2006, 10:12 ) *
zupelnie przemodelowalem dzialanie klasy , powinna dzialac jeszcze szybciej, dopisalem jak wygladaja tagi reszty sie chyba mozna juz dopmyslic z kodu.

angrysmiley.gif

chcialbym zglosic ze bbcode sluzacy do wyswietlania kodu php nie dziala prawidlowo
porownajcie prosze te linijke :

$patterns[] = '/{ *include *([^}]*) *}/i';
$replacements[] = '<?php include(\''.$this->katalog_cache.'\'.str_replace(\'..\',NULL,'.'\'\1\')'.'.\'.php\'); ?>';
$parsed_templat = preg_replace($patterns, $replacements, $zawartosc_templata );

z tym co wyswietla sie w bbcodzie php z pierwszego postu
Rafiki
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 ?
bim2
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
Rafiki
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 ).
bim2
Nie rozumiesz nie da się tak! Bo on musi zapisać aby wykonac kod php (file_get_contents czyta plik ale go nie wykonuje ;/) Zrozum, mi sie to neipodba, niech autor sie wypowie
Rafiki
omg co sie nieda :| zawartosc cachu zostanie pobrana przez file_get_contents i przypisana do zmiennej a nastepnie ta zmienna zostanie wyswietlona.

Poczytaj np art na webcity.pl w praktyce o tworzeniu klasy sql lub tez http://www.leon.w-wa.pl/texts/templates.php

Przy pierwszy wyswietleniu szablonu gdy cachu jeszcze niema pierw on powinien zostac wyswietlony pozniej zapisany do pliku. Przy kolejnych wyswietlaniach cache powinien byc pobierany przez file_get_contents albo starsze funkcje z php 4 a nastepnie wyswietlamy to co pobralismy z pliku.
bim2
O lol, o sobie tak zrob ;o. Ja próbowałem wyświetlać i... sam zobacz. withstupidsmiley.gif
Rafiki
Cytat(bim2 @ 21.07.2006, 13:29 ) *
O lol, o sobie tak zrob ;o. Ja próbowałem wyświetlać i... sam zobacz. withstupidsmiley.gif

Ja juz dawno tak zrobilem, napisalem na tej podstawie klasy do mysqla oraz klase szablonow. Przeczytaj prosze http://webcity.pl/webcity/artykuly.php/t/51 oraz http://www.leon.w-wa.pl/texts/templates.php a sam sie przekonasz. Pierw przeczytaj w wikipedi co to php a pozniej lol'uj, bo narazie zamiast normalnie dyskutowac zachowujesz sie jak niewychowany smarkacz.
ergo
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...
bim2
No przeciez mu to mówiłe..pisałem przez cały czas ;/ Ze to generuje kod php dlatego musi zapisac, a funkcja include go wykona blinksmiley.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.