Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Polska odpowiedź na SMARTY.
Forum PHP.pl > Forum > Gotowe rozwiązania > Systemy szablonów
harpcio
Witam serdecznie wszystkich,

Jakiś czas temu napisałem klasę obiektową gepard, która służy do tworzenia szablonów dla aplikacji php.
Dzieki niej, jest możliwe całkowie odseparowanie kodu źródłowego php od kodu HTML.

Jej cechy charakterystyczne to prostota, szybkość działania oraz minimalna ingerencja w kod html.

Jeśli ktoś ma ochotę, proszę zajrzeć na stronę:
www.gepard.w.pl

Bardzo mile widziane wszelkie uwagi, opienie, wrażenia.

Pozdrawiam serdecznie!
NuLL
Odpowiedz na SMARTY - ROTFL laugh.gif Przeciez tam jest echo wiec jakie to oddzielenie ?
harpcio
Cytat(NuLL @ 5.01.2007, 00:57:15 ) *
Odpowiedz na SMARTY - ROTFL laugh.gif Przeciez tam jest echo wiec jakie to oddzielenie ?

Witam,
jeśli chodzi o instrukcje echo - to jak zapewne zauważyłeś, użyłem ich w kodzie php tylko do wyświetlenia niezbędnych informacji, z całkowitym pominięciem kodu html.
Natomiast w kodzie html nie uświadczysz nigdy żadnych instrukcji php, tak jak to ma miejsce np.
w bibliotece SMARTY.

Użycie instrukcji echo to specyficzny przypadek, stosowany po słowie kluczowym $exit$.
Zresztą zastosowany tylko dla przykładu dla osób dopiero co uczących się.

Proszę, zobacz przykład tutaj (ostatni post).

W każdym bądź razie, dziękuję Ci za pierwszą opinię smile.gif
AxZx
skad wziales S.M.A.R.T.Y.?
popraw na SMARTY jak juz

nie zglebialem sie w kod, masz tam metode taka ktore nie wyswietli odrazu kodu HTML tylko bede mogl ja podstawic pod jakas zmienna?
w smarty fetch().
harpcio
Cytat(AxZx @ 5.01.2007, 11:24:37 ) *
skad wziales S.M.A.R.T.Y.?
popraw na SMARTY jak juz

Gdzieś widziałem taki zapis i mi się po prostu utrwalił. Poprawiłem.

Cytat(AxZx @ 5.01.2007, 11:24:37 ) *
Nie zglebialem sie w kod, masz tam metode taka ktore nie wyswietli odrazu kodu HTML tylko bede mogl ja podstawic pod jakas zmienna? W smarty fetch().

Nie, nie mam takiej funkcji.
Klasa Gepard jest tylko podstawowym zbiorem najważniejszych funkcji, dlatego jest taka szybka.
Nie widzę jednak przeszkód, by taką funkcję w przyszłości dodać do mojej klasy.
AxZx
Cytat
Gdzieś widziałem taki zapis i mi się po prostu utrwalił. Poprawiłem.

S.M.A.R.T. to raczej w hardwarze jest, a konkretniejest to technologia diagnozowania dyskow twardych.

Cytat
Nie widzę jednak przeszkód, by taką funkcję w przyszłości dodać do mojej klasy.

a widzisz, czyli jak ja teraz bedziesz rozbudowywal bo duzo wiecej rzeczy bedzie potrzebnych to urosnie do takich samych rozmiarow jak Smarty i tak samo 'powoli' bedzie dzialac.
SHiP
Cytat(AxZx @ 5.01.2007, 15:23:05 ) *
a widzisz, czyli jak ja teraz bedziesz rozbudowywal bo duzo wiecej rzeczy bedzie potrzebnych to urosnie do takich samych rozmiarow jak Smarty i tak samo 'powoli' bedzie dzialac.

Nie do konca się zgadzam, czasem po prostu inny system zapisu moze byc szybciej parsowany...

Co do samej klasy winksmiley.jpg Sam pisze w wolnym czasie podobną i dlatego w twojej nie podoba mi się:
- brak modyfikatorow ( ten sysem $exit$ jest debilny ;] )
- brak mozliwosci uzycia funkcji wewnatrz kodu html
- brat instrukcji warunkowych( czy moze byly?)
- tym samym brak tablic
- brak funkcji include

W każdym bąrdz razie nie wczytywałem się za dokladnie kod(jakos dziwnie to jest pisane). Proponuję zmianę filozofi co do wysyłania zmiennych do szablonu ;]
Speedy
Smarty pozwala na trochę więcej rzeczy, niż tylko przypisanie jakiejś wartości do zmiennej w szablonie i zrobienie pętelki tongue.gif. Nie zgłębiałem się w to, ale na pierwszy rzut oka, ten system nie robi na mnie wrażenia.

ps. Zgadzam się z przedmówcą, że oznaczenie $cośtam$ jest nieco dziwne winksmiley.jpg.
harpcio
Cytat
a widzisz, czyli jak ja teraz bedziesz rozbudowywal bo duzo wiecej rzeczy bedzie potrzebnych to urosnie do takich samych rozmiarow jak Smarty i tak samo 'powoli' bedzie dzialac.
Jeżeli dodawałbym do niej wszystko co się rusza i na drzewo nie ucieka , to tak, stanie się ociążałą, pozbawioną sensu maszkarą. Moim celem, było całkowita eliminacja z kodu html znaczników php, takich jakie występują w smarty.
Wiem, ten sposób jak widać ma wielu przeciwników, ale mnie akurat bardzo ułatwia życie. Klasa ta posiada niewiele funkcji i tym samym jest bardzo łatwa do zapamiętania.

Cytat(SHiP @ 5.01.2007, 15:21:58 ) *
Co do samej klasy winksmiley.jpg Sam pisze w wolnym czasie podobną i dlatego w twojej nie podoba mi się:
- brak modyfikatorow ( ten sysem $exit$ jest debilny ;] )
- brak mozliwosci uzycia funkcji wewnatrz kodu html
- brat instrukcji warunkowych( czy moze byly?)
- tym samym brak tablic
- brak funkcji include
System jak system, jednym może się podobać innym nie, nie twierdzę że jest idealny.
Można go z łatwością zastąpić systemem {zmienna} lub {exit} - są gusta i guściki.
Funkcje występują w php - do wyboru do koloru - po co to mieszać z html'em?
Instrukcje warunkowe też są w php - do wyboru do koloru - po co to mieszać z html'em?
Tablice, hmm.. jeśli znalazłyby zastosowania, nie ma problemu ich stworzyć smile.gif
Funkcja include jest w php.

Cytat
W każdym bąrdz razie nie wczytywałem się za dokladnie kod(jakos dziwnie to jest pisane). Proponuję zmianę filozofi co do wysyłania zmiennych do szablonu ;]
Co jest w nim dziwnego? Formatowany z edytorze php 'KED'. A jeśli pętelki Ci nieodpowiadają, to już witki mi opadają. Co do zmiennych, to nie są one wysyłane do szablonu, lecz do klasy Gepard. W szablonie nie ma żadnych zmiennych, są tylko znaczniki $cośtam$ zamieniane w klasie Gepard na zmienne.

Ogólnie rzecz biorąc, moja klasa Gepard, nie będzie lepsza od SMARTY, nie będzie miała więcej pożytecznych funkcji - nigdy nie miałem takiego zamiaru pisząc ją. Miała być szybka, prosta i skuteczna. I tak właśnie jest.

A Wy zawsze musicie wszystko krytykować smile.gif tongue.gif
nrm
Polską odpowiedzią na smarty jest zdecydowanie Open Power Template.
SHiP
Co do pozytecznosci instrukcji warunkowych i funkcji. Weźmy pod uwagę to co tworzy grafik(i/lub osoba od htmla). Chce stworzyć layout który będzie mial zielony top, gdy użytkownik jest zalogowany, a niebieski gdy użytkownik jest niezalogowany(+ pole do logowania). Umieszczasz warunki w php i wszystko jest pięknie. Po tygodniu grafik zmienia zdanie, postanawia jednak zrobić tak aby top był zawsze niezmienny, niech zmienia się stopka. W następnym tygodniu odbije mu coś i wpadnie na coś jeszcze innego i bedzie chciał kolejnych zmian w php.

Po co używać funkcji? Znów dla wygody programisty php. Dajmy na to grafik będzie chciał datę w pełnym formacie. Jednak później zmieni wygląd i pełna data mu się nie będzie mieścić. Co robic? Znowu zawracać głowę programiscie?

W przypadku dobrego parsera, grafik ma odpowiednie konstrukcje dzięki którym może DOWOLNIE(no prawie - pewnych rzeczy nie da się z kosmosu wziąć) zmieniać wygląd i zachowanie pewnych elementów strony bez jakichkolwiek zmian w kodzie php.

Cytat
A Wy zawsze musicie wszystko krytykować

Taka nasza rola winksmiley.jpg
Zyx
Rozbudowany system szablonów wcale nie musi być wolniejszy od minimalistycznego. Widziałem już wiele "małych" systemów, które nie wytrzymywały konkurencji ze "przeładowanym" Smarty'm smile.gif. Zrobiłem także Gepardowi mały teścik porównawczy: prosta stronka wyświetlająca liczby od 0 do 99, testowana programem Apache Bench (n == 500). Wyniki średnie:

- Gepard: 100.21 rps
- OPT: 99.06 rps

Różnice wydajnościowe są minimalne, a OPT jest niewiele szybszy od Smarty, który w tym samym teście osiągnąłby wobec tego podobną szybkość. Zwróćmy uwagę na pewną rzecz: jeśli na stronie mamy sześć różnych list, musimy utworzyć przynajmniej siedem klas Gepard i siedmiokrotnie załadować jakieś pliki z szablonami. Okazuje się, że bardzo odbija się to na wydajności. Przerobiłem nieco test, aby ukazał tę sytuację. Każdy z systemów miał wyświetlić liczby od 0 do 99 sześciokrotnie. Ponieważ nie chciało mi się wymyślać cudów, wszystkie w zasadzie miały identyczny kod, tylko Gepardowi sześć razy z osobna tworzyłem obiekt klasy, aby zasymulować sytuację, że wszystkie listy są inne. Rezultat:

- Gepard: 24.89 rps
- OPT: 87.47 rps

Prawdopodobnie da się umieścić wszystkie wersje listy w jednym pliku i obsługiwać je jedną klasą, lecz dokumentacja Geparda jest nienajlepsza - nawet przykłady tam zawarte preferują wielokrotne ładowanie tego samego pliku do pamięci, stąd też użyłem właśnie takiego podejścia.

Poniżej prezentuję kod php użyty do testów - przy okazji zwróć uwagę na długość obu z nich smile.gif.

1. Gepard:

  1. <?php
  2.  
  3. require('./gepard/gepard_final.inc.php');
  4.  
  5. $strona = new Gepard('strona');
  6. $strona -> CreateCode();
  7.  
  8. $lista = new Gepard('lista', 'lista');
  9.  
  10. for($i = 0; $i < 100; $i++)
  11. {
  12. $lista -> AssignVar('item', $i);
  13. $lista -> CreateCode('repeat');
  14. }
  15.  
  16. $lista = new Gepard('lista', 'lista');
  17.  
  18. for($i = 0; $i < 100; $i++)
  19. {
  20. $lista -> AssignVar('item', $i);
  21. $lista -> CreateCode('repeat');
  22. }
  23.  
  24. $lista = new Gepard('lista', 'lista');
  25.  
  26. for($i = 0; $i < 100; $i++)
  27. {
  28. $lista -> AssignVar('item', $i);
  29. $lista -> CreateCode('repeat');
  30. }
  31.  
  32. $lista = new Gepard('lista', 'lista');
  33.  
  34. for($i = 0; $i < 100; $i++)
  35. {
  36. $lista -> AssignVar('item', $i);
  37. $lista -> CreateCode('repeat');
  38. }
  39.  
  40. $lista = new Gepard('lista', 'lista');
  41.  
  42. for($i = 0; $i < 100; $i++)
  43. {
  44. $lista -> AssignVar('item', $i);
  45. $lista -> CreateCode('repeat');
  46. }
  47.  
  48. $lista = new Gepard('lista', 'lista');
  49.  
  50. for($i = 0; $i < 100; $i++)
  51. {
  52. $lista -> AssignVar('item', $i);
  53. $lista -> CreateCode('repeat');
  54. }
  55.  
  56. $strona -> CreateCode();
  57.  
  58. ?>


2. OPT:

  1. <?php
  2.  
  3. define('OPT_DIR', './opt/');
  4. require(OPT_DIR.'opt.class.php');
  5.  
  6. try
  7. {
  8. $tpl = new optClass;
  9. $tpl -> root = './templates/';
  10. $tpl -> compile = './templates_c/';
  11.  
  12. $result = array();
  13. for($i = 0; $i < 100; $i++)
  14. {
  15. $result[] = array('item' => $i);
  16. }
  17. $tpl -> assign('lista', $result);
  18. $tpl -> parse('strona.tpl');
  19. }
  20. catch(optException $e)
  21. {
  22. optErrorHandler($e);
  23. }
  24. ?>


W OPT (oraz w Smarty'm) raz załadowanego zestawu danych mogę używać wielokrotnie w różnych miejscach, jeśli jest mi to potrzebne. W Gepardzie nie dość, że każde kolejne użycie musi być dodatkowo oprogramowywane w php, to jeszcze jest to porozrzucane dość nieładnie po kilku plikach. Przy większym projekcie zapewne bym się w tym pogubił.

Cytat
Jeżeli dodawałbym do niej wszystko co się rusza i na drzewo nie ucieka , to tak, stanie się ociążałą, pozbawioną sensu maszkarą.


Argument "im więcej opcji, tym jest to wolniejsze" jest mitem. Tak naprawdę wszystko zależy od wykorzystanego sposobu kompilacji szablonów. Gepard całą mechaniką zajmuje się samodzielnie, co w przypadku prostych rozwiązań może dawać spore zyski, ale dla bardziej zaawansowanych faktycznie skutkuje coraz poważniejszym spadkiem wydajności (iterpreter interpretuje interpreter interpretujący kod). Smarty oraz OPT są w zasadzie kompilatorami, które cały szablon przetwarzają do postaci czystego kodu php, który w kolejnych odsłonach jest zwyczajnie dołączany np. przez include(). Dlatego instrukcje warunkowe, pętle itd. działają tam z taką samą prędkością, jak w php, ponieważ tak naprawdę one są napisane bezpośrednio w php, a nie interpretowane przez napisany w php interpreter. Trochę zawile to opisałem, ale myślę, że sens da się zrozumieć smile.gif. Oba systemy ładują podczas normalnej pracy jedynie fragment swego własnego kodu do pamięci. Kompilator oraz algorytmy przetwarzające znaczniki w szablonach na kod php wczytywane są tylko, gdy zachodzi potrzeba skompilowania czegoś. Dlatego w obu możesz mieć na dobrą sprawę nawet i tysiąc różnych instrukcji, ale podczas normalnego użytkowania nie odczujesz żadnego spadku wydajności z tego powodu, ponieważ kod ten będzie co najwyżej miejsce na dysku zajmował i nic ponadto.

--edit (sab) Poprawiłem bbcode listingów.
harpcio
Witam serdecznie,
bardzo się cieszę, że moja klasa cieszy się taką popularnością.

A teraz do rzeczy,
z uwagi że moja klasa Gepard, nie posiada niestety danych typu "array",
powyżej przedstawiony dowód jest oczywisty do przewidzenia.

Skoro postawiliście mnie pod murem, mówi się trudno, będę musiał dopisać pare rzeczy do niej,
gdyż bardzo chciałbym sprawdzić jak pójdzie mojej Klasie, gdy takowa będzie miała wbudowane listy smile.gif

Jestem pewien że równie dobrze lub nawet lepiej niż klasie Smarty.

Kilka uwag: a) nie trzeba tworzyć nowego obiektu Gepard, by móc wyświetlić dany element jeszcze raz,
wystarczy na nowo przypisac zmienne i kolejny raz wywołać funkcję CreateCode().

#Niestety moja dokumentacja nie jest kompletna, za co bardzo przepraszam#

cool.gif w jednym pliku można umieścić kilka różnych elementów i wyświetlać je wielokrotnie - bez wielokrotnego przetwarzania tego samego kodu.

Postaram się w niedługim czasie, przedstawić odpowiedni kod.

Tymczasem pozdrawiam wszystkich bardzo serdecznie.
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.