Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [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
NetJaro
post 4.07.2006, 13:18:58
Post #2





Grupa: Zarejestrowani
Postów: 475
Pomógł: 0
Dołączył: 1.04.2005
Skąd: Warszawa

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


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
Go to the top of the page
+Quote Post
ergo
post 4.07.2006, 13:26:48
Post #3





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

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


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 :]


--------------------
Go to the top of the page
+Quote Post
ActivePlayer
post 4.07.2006, 16:03:46
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Przenosze do "algorytmy, klasy, funkcje"
Go to the top of the page
+Quote Post
ergo
post 6.07.2006, 09:51:20
Post #5





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

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


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


--------------------
Go to the top of the page
+Quote Post
Rafiki
post 19.07.2006, 20:23:59
Post #6





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





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 #8





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
bim2
post 20.07.2006, 17:42:15
Post #9





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

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


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


--------------------
Go to the top of the page
+Quote Post
Rafiki
post 20.07.2006, 21:39:36
Post #10





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

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


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.
Go to the top of the page
+Quote Post
bim2
post 21.07.2006, 14:29:09
Post #11





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

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


O lol, o sobie tak zrob ;o. Ja próbowałem wyświetlać i... sam zobacz. withstupidsmiley.gif


--------------------
Go to the top of the page
+Quote Post
Rafiki
post 21.07.2006, 19:54:32
Post #12





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

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


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.

Ten post edytował Rafiki 21.07.2006, 19:56:20
Go to the top of the page
+Quote Post
ergo
post 7.08.2006, 22:25:30
Post #13





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
bim2
post 8.08.2006, 07:27:18
Post #14





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

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


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


--------------------
Go to the top of the page
+Quote Post

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: 25.04.2024 - 22:09