Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jaki system szablonów?
Forum PHP.pl > Forum > PHP
koraso
Zaczynam po woli myśleć o mojej pracy dyplomowej. Będę pisał CMS taki ogólno-tematyczny al'a PHP-Fusion. Na razie jestem na etapie planowania.
I zastanawiam się jakiego systemu szablonów użyć. Chciałbym coś lekkiego, ale jednocześnie żeby obsługiwało instrukcje warunkowe i pętle.
-Smarty jak każdy wie jest bardzo ociężałe tak więc raczej odpada.
-Open Power Templates lepiej, ale też jest tak mocno rozbudowane, że nie wykorzystam większości jego dobrodzejstw, wiec też raczej odpada.
-bTemplate - całkiem przyjemnie prezentuje się, ale ten projekt nie jest już rozwijany od 2003roku więc pewnie troszkę przestarzały kod. Ciekaw jestem jak z wydajnością?
-FreeTemplate - Przestarzałe...
Czekam na Wasze opinie i wskazówki winksmiley.jpg
wookieb
Żadnego. Coraz więcej ludzi przechodzi na szablonu phpowe w odpowiedniej składni, a dlaczego? Ponieważ systemy szablonów są wolniejsze i czasem nawet ograniczają. Był na forum temat o tym, trzeba poszukać.
destroyerr
Jeśli chodzi o OPT to co z tego, że nie wykorzystasz wszystkich jego możliwości. Przecież nic za to nie płacisz więc ma to niewielkie znaczenie. Przecież w PHP też nie wykorzystujesz wszystkich funkcji a jednak w nim programujesz.
Osobiście z tych, które wymieniłeś polecam OPT, ale możesz też sprawdzić Twig.

Pewnie pojawią się osoby, które będą Ci odradzały użycie systemu szablonów, będą Cię przekonywały, że czyste PHP będzie lepsze i "szybsze". Będą mieć rację jeśli jedyną korzyścią jaką chcesz uzyskać z systemu szablonów to skrócenie zapisu warunków i pętli. Jeśli jesteś na etapie projektu to rozważ poważnie użycie systemu szablonów, jako warstwy prezentacji - OPT sprawdzi się tutaj naprawdę dobrze.
koraso
Cytat(wookieb @ 10.02.2010, 22:55:20 ) *
Żadnego. Coraz więcej ludzi przechodzi na szablonu phpowe w odpowiedniej składni, a dlaczego? Ponieważ systemy szablonów są wolniejsze i czasem nawet ograniczają.

Ale to w założeniu ma być system "dla każdego", więc taki system szablonów zdecydowanie ułatwi przeciętnemu Kowalskiemu modyfikację html.

Cytat(destroyerr @ 10.02.2010, 22:58:59 ) *
Jeśli chodzi o OPT to co z tego, że nie wykorzystasz wszystkich jego możliwości. Przecież nic za to nie płacisz więc ma to niewielkie znaczenie. Przecież w PHP też nie wykorzystujesz wszystkich funkcji a jednak w nim programujesz.

Niby tak, ale OPT to wielka kobyła i jednak wolał bym coś w tym stylu tylko mniej rozbudowane. Jeśli nie znajdę nic innego to pewnie użyje właśnie OPT;)
bolverk
Ja ze swojej strony szczerze polecam Savant 3. Jest łatwy do opanowania, nie wymaga nauki nowego języka znaczników bo działa w PHP.

Oto strona: Savant3

Wystarczy ściągnąć wersję 3.0. Co do instalacji ja zrobiłem tak:

W htdocs zrobiłem folder Savant3 i tam umieściłem Savanta. Potem w samym htdocs utworzyłem plik savant3_inlude.php z następującym kodem:

Kod
<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/Savant3/Savant3.php");
$savant3 = new Savant3(array('template_path' => $_SERVER["DOCUMENT_ROOT"].'/Savant3/templates'));
?>


Ten plik trzeba dołączać tam gdzie chce się używać Savant 3.

Należy oczywiście utworzyć w folderze Savant3 nowy folder o nazwie templates i tam umieszczać szablony.
I to wszystko.

System jest łatwy ale to naprawdę łatwy w użyciu i jeszcze raz go polecam. Zrezygnowałem na jego rzecz ze Smartyego smile.gif
Zyx
koraso -> i co z tego, że kobyła, kiedy wydajnościowo wygrywa praktycznie z każdym poważniejszym projektem*? Jedyną "kobyłą" w OPT jest kompilator, który ładuje się raz na długi czas, a poza tym biblioteka jest dość mała. I ten "kobylasty" kompilator dlatego jest taki rozbudowany, by przeciętny Kowalski poradził sobie z edycją kodu, by nie musiał bawić się w techniczne i implementacyjne duperele, by pomóc programiście znaleźć błędy już na samym początku oraz by szablony były przenośne.

* - wliczając w to "czyste" PHP obudowane kupą obiektowych/funkcyjnych helperów, bez których próba zrobienia nawet najprostszego szablonu to masochizm.
Rudi1204
pozwolę sobie podpiąć się pod temat i też się Was zapytam jak chodzi o system szablonów (bTemplate, Twig, phpTal, PatTemplate, fasttemplate) co z tych czterech mogli byście mi poradzić? Jak u nich z wydajnością? Wiem, że na rynku jest wiele systemów ale wolał bym się skupić na tych wymienionych, poza tym daaaaawno nie pisałem stron sadsmiley02.gif i też mi zależy na prostocie, aby jak najmniej się uczyć "nowego" kodu (wystarczy mi już sam fakt, że duuuużo jest do przypomnienia).
askone
Cytat(Zyx @ 11.02.2010, 08:15:34 ) *
koraso -> i co z tego, że kobyła, kiedy wydajnościowo wygrywa praktycznie z każdym poważniejszym projektem*? Jedyną "kobyłą" w OPT jest kompilator, który ładuje się raz na długi czas, a poza tym biblioteka jest dość mała. I ten "kobylasty" kompilator dlatego jest taki rozbudowany, by przeciętny Kowalski poradził sobie z edycją kodu, by nie musiał bawić się w techniczne i implementacyjne duperele, by pomóc programiście znaleźć błędy już na samym początku oraz by szablony były przenośne.

* - wliczając w to "czyste" PHP obudowane kupą obiektowych/funkcyjnych helperów, bez których próba zrobienia nawet najprostszego szablonu to masochizm.


Całkowicie zgadzam się z tym co napisał Zyx - system zacząłem poznawać od wersji 2 i podstawy pozwalające na utworzenie prostego serwisu można opanować bardzo szybko. Zaletą rozwiązania jest kompilacja szablonu, wtedy na produkcji nie ma potrzeby odpalania "kobylastego" kompilatora i całość śmiga, że ho ho

Pozdro
windman
Cytat(koraso @ 10.02.2010, 23:12:41 ) *
Ale to w założeniu ma być system "dla każdego", więc taki system szablonów zdecydowanie ułatwi przeciętnemu Kowalskiemu modyfikację html.

Skoro dla każdego to nawet najprostszy system szablonów będzie zbyt skomplikowany.
Kiedyś też zastanawiałem się nad systemem szablonow... aż poznałem Yii php framework.
Tam staosowane sa 'szablony' php, wszystko bardzo intuicyjne i łatwe.

przykład:
W kontrolerze:

  1. $this->render('tutaj_nazwa_pliku_z_szablonem', array('model'=>$samochody, 'tablica1'=>$tablica1, 'zmienna1'=>$zmienna1));


Plik z szablonem (view):

  1. <div> <?=$tablica1['tytul']?></div>
  2. <table>
  3. <?php
  4. foreach($model as $kategoria){
  5. echo '<tr><td>' . $kategoria->nazwa . '</td></tr>';
  6. }
  7. ?>
  8. </table>
  9. <div class="clear"></div>
gothye
Jako zwolennik smarty wypowiem się ....
Z Smarty bywało róznie na początku ale od wersji 2.6.20 pracuję mi sie z nim naprawdę dobrze ,ale od kąd zaczynam testowac i wdrażać w projekty wersje testową 3.0 to już inna bajka ,nie wyobrażam sobie tworząc strone wielojęzyczną bez frameworka smarty
mhs
Zapytam może o coś innego. Dużo dobrego słyszałem o OPT i chciałbym to dokładniej przetestować. Pytanie w tym momencie dla mnie bardzo ważne: można szybko i w miarę bezboleśnie przemigrować ze Smarty na OPT? Chociażby postawić oprogramowanie na jednym i drugim systemie szablonów i zobaczyć jak z wydajnością.
Pilsener
Nie, nie można "przemigrować" bo wymaga to nie tyko podmiany plików z kodem źródłowym czy szablonów, ale także nierzadko modyfikacji silnika w części, gdzie zmienne są dodawane do widoku i oczywiście samego widoku.

Ogólnie przyjęte metody są takie:
- system szablonów skrajnie prosty, by każdy mógł go użyć (bez pętli, warunków etc.) - jest to dobre w małych projektach i tam, gdzie nie ma potrzeby zaawansowanej edycji kodu HTML
- system szablonów oparty o składnię PHP - daje możliwości i jak ktoś zna się na PHP to poradzi sobie z takim systemem bez problemu
- system szablonów znany i popularny (np. Smarty) - pomimo całych swoich wad mamy dokumentację, support techniczny i bez problemu znajdziemy ludzi, którzy się na tym znają
nowy_pehapowiec
Moim zdaniem lepiej sobie dać spokój z templatami. Fajnie działają jeśli w znaczniki html dodajemy statyczne treści z bazy danych. Ale jeśli trzeba dodać coś dynamicznego np tabele albo listy to już nie jest tak fajnie. Zdecydowanie polecam czysty php i include odpowiednich plików z fragmentami. Wystarczy napisać sobie kilka funkcji (np dodających znaczniki tworzące tabele, listy) i wszystko jest proste i wydajne.

pozdro
Zyx
nowy_pehapowiec -> widziałeś kiedyś jakiś poważniejszy system szablonów czy testowałeś jedynie takie, gdzie się dało statyczne treści osadzać? Dwa podstawowe błędy:

Cytat
decydowanie polecam czysty php i include odpowiednich plików z fragmentami.


Nawet jak wybierzesz PHP, to będzie to szablon, a biblioteka do jego uruchamiania - system szablonów.

Cytat
wszystko jest proste i wydajne.


Ani proste, ani tym bardziej wydajne. Niech Ci przybędzie tak 500 funkcji i reimplementowania każdej funkcji 2548 razy dla każdej nieco odmiennej sytuacji, bawienia się z błędami redefiniowania funkcji, to się przekonasz. Zawsze jak muszę pisać szablony w PHP, wraz ze wzrostem projektu robi się w nich coraz większy burdel i galimatias, a przy próbie ponownego wykorzystania jakiegoś kawałeczka można się pochlastać.

Kod
<div opt:section="blogEntry" class="entry">
  <h1>{$blogEntry.title}</h1>
  {u:$blogEntry.body}

  <p class="tags"><opt:section="tags" str:separator=", "><a parse:href="$tag.url">{$tag.name}</a></opt:section></p>
</div>


Proszę bardzo, dodałem listę, i to zagnieżdżoną + oddzielanie przecinkami tagów. Gdzie tu widzisz coś skomplikowanego i "niefajnego"?
wookieb
@zyx Dude wiem, że jesteś współautorem OPT, którego długi czas używałem ale wybacz, po prostu bredzisz.

Szablony w czystym php może do najczytelniejszych nie należą ale zdecydowanie są wydajne! Co do funkcji, jest coś takiego jak helpery, które znacznie ułatwiają robotę.
Poza tym implementacją 1 (słownie jednej) klasy do obsługi szablonów jest lżejsza od całego OPT, Smarty, które bądź co bądź nie dają mi nic więcej poza czytelnością kodu. Przy odpowiednim przygotowaniu helperów i klasy do szablonów, czysty php zdecydowanie jest zwycięzcą w tym pojedynku.

P.s. Kod który podałeś wcale taki czytelny też nie jest.
nowy_pehapowiec
Nie czytelny? O czym my mówimy? Żeby wypisac słowa po przecinku:
Kod
<p class="tags"><opt:section="tags" str:separator=", "><a parse:href="$tag.url">{$tag.name}</a></opt:section></p>


to ja już wolę wstawki w rodzaju <? ?> co linijkę smile.gif

pozdro
Zyx
wookieb -> a sprawdzałeś to doświadczalnie? Bo ja tak smile.gif. I sprawa z wydajnością wygląda tak, że 99,9% systemów szablonów także kompiluje szablon do postaci kodu PHP, więc jedyne pytanie brzmi, kto zrobi to lepiej: człowiek czy automat.

1. Człowiek musi jakoś dbać o czytelność kodu, automat nie musi, więc może stosować wydajniejsze konstrukcje.
2. W czystym PHP trzeba wszystko obliczać w czasie wykonywania, kompilator może część rzeczy obliczyć na etapie kompilacji i zaoferować to samo, generując dużo prostszy kod.
3. Kod wielu rozwiązań bazujących na helperach (które przy okazji trzeba przygotowywać w nienaturalny zupełnie sposób, klepiąc kod PHP, zamiast pracować z normalnym HTML-em) jest naprawdę złożonych i wymagających obliczeniowo: rendering formularzy, rendering drzewek w Zend Framework... taki placeholderLoop żeby mieć współdzieloną treść pętli, za każdą iteracją tworzy i inicjuje nowy, ogromny obiekt widoku i robi include... jak pętla ma 100 elementów, można sobie odpowiedzieć, co się dzieje. W OPT przy analogicznej funkcjonalności otrzymujemy prostą pętlę i tyle.

A że nie wszystkie systemy szablonów z tego korzystają, to już inna sprawa. Front-end OPT nie różni się wielkością i funkcjonalnością od typowych klas do tego samego celu stosowanych we frameworkach. Najobszerniejsza część to kompilator, który jest ładowany tylko gdy jakiś szablon jest modyfikowany, czyli w praktyce jedynie na etapie tworzenia.

nowy_pehapowiec -> to pokaż, jak Ty byś to przy pomocy PHP zapisał, by było czytelnie. Według mnie powiedzenie: "oddzielaj mi słowa przecinkiem", czyli dodanie jednego atrybutu jest dużo przyjemniejsze od klepania całego algorytmu do odpowiedniego przefiltrowania tych danych. Oto wersja bez oddzielania przecinkiem:

Kod
<p class="tags"><opt:section="tags"><a parse:href="$tag.url">{$tag.name}</a></opt:section></p>


Apel: jak ktoś mówi o czytelności, to niech pokaże przykład i opisze go krótko, co się tam dzieje i dlaczego według niego jest on czytelny. Inaczej to się można przerzucać jak dzieci w piaskownicy "mój jest czytelniejszy - gupi jesteś, mój jest!" A ja w takiej pseudodyskusji udziału nie mam ochoty brać i puste słowa będę zwyczajnie olewać.
wookieb
Tak sprawdzałem doświadczalnie. Tak jak pisałem długo pracowałem na OPT (mój system na nim powstał) i wszystko było ok dopóki nie zauważyłem, że pisanie kodu w czystym phpie nie robi mi prawie żadnej różnicy. Trzeba przyznać ze korzystanie z opt i podobnych na pewno jest łatwiejsze dla człowieka i to jest fakt, aczkolwiek dla mnie przynosiły więcej problemów niż prawdziwego pożytku.

Wspomnę może tutaj parę grzechów opt1 - wiem, że może zabrzmi to niekompetentnie, ponieważ z opt2 nie korzystałem:
Wyłączenie raportowania E_NOTICE
E_NOTICE pomimo swojej nazwy są bardzo użyteczne w procesie debugowania problemu dlatego też cały czas miałem je włączone i jedynie je wyłapywałem, wyświetlając wtedy kiedy tego potrzebowałem a resztę zapisywałem do logów. Opt nie sprawdzał czy klucz w tablicy istnieje (co jest szybsze niż wyłączenie raportowania) i zasypywał mi logi śmieciami typu undefined index.

Brak wsparcia dla łączenia zmiennych znakiem "."
Nie przechodziło coś takiego
Kod
{nazwa_funkcji($test.$test2)}


Konieczność tworzenia listy używanych funkcji
Brak możliwości korzystania z dowolnej funkcji phpowej w szablonie. Przy dużym projekcie może powstać potężna tablica samych aliasów funkcji i dostępu do nich. To jest dopiero nienaturalne smile.gif

Narazie pamiętam tylko te 3.

Cytat(Zyx @ 24.04.2010, 09:22:08 ) *
1. Człowiek musi jakoś dbać o czytelność kodu, automat nie musi, więc może stosować wydajniejsze konstrukcje.

Człowiek nadal musi dbać o czytelność tplków
Cytat(Zyx @ 24.04.2010, 09:22:08 ) *
2. W czystym PHP trzeba wszystko obliczać w czasie wykonywania, kompilator może część rzeczy obliczyć na etapie kompilacji i zaoferować to samo, generując dużo prostszy kod.

Muszę się zgodzić ale warto byś tu przytoczył choć parę rzeczy w których kompilator NAPRAWDĘ pomaga i odciąża PHP.

Cytat(Zyx @ 24.04.2010, 09:22:08 ) *
3. Kod wielu rozwiązań bazujących na helperach (które przy okazji trzeba przygotowywać w nienaturalny zupełnie sposób, klepiąc kod PHP, zamiast pracować z normalnym HTML-em) jest naprawdę złożonych i wymagających obliczeniowo: rendering formularzy, rendering drzewek w Zend Framework... taki placeholderLoop żeby mieć współdzieloną treść pętli, za każdą iteracją tworzy i inicjuje nowy, ogromny obiekt widoku i robi include... jak pętla ma 100 elementów, można sobie odpowiedzieć, co się dzieje. W OPT przy analogicznej funkcjonalności otrzymujemy prostą pętlę i tyle.

Jeżeli chcesz mieć naprawdę łatwe w użyciu narzędzie (dość uniwersalne) do wyświetlanie bardziej zaawansowanych struktur to w opt tworzysz plugin czyli bądź co bądź również "trzeba przygotowywać w nienaturalny zupełnie sposób, klepiąc kod PHP". Chociażby przykład struktury drzewa.

Cytat(Zyx @ 24.04.2010, 09:22:08 ) *
Apel: jak ktoś mówi o czytelności, to niech pokaże przykład i opisze go krótko, co się tam dzieje i dlaczego według niego jest on czytelny. Inaczej to się można przerzucać jak dzieci w piaskownicy "mój jest czytelniejszy - gupi jesteś, mój jest!" A ja w takiej pseudodyskusji udziału nie mam ochoty brać i puste słowa będę zwyczajnie olewać.

Bardziej pracowałem na pierwszej wersji opt gdzie jeszcze używałem składni {...} gdzie ich stosowanie (przy małej modyfikacji IDE) było czytelniejsze niż tagi
Kod
<opt:section="tags">
które dla mnie strasznie zlewają się z html-em co już bardziej skłania mnie w stronę XSLT niż do stosowanie takiego systemu szablonu (nie pamiętam czy jest jeszcze możliwość korzystania z {} w opt2). Oczywiście nie twierdzę, że opt jest nie czytelne bo bym skłamał ale dla mnie to tylko jedyna zaleta korzystania z wszelkich "template engines".

Co do czytelności to już są bardziej subiektywne odczucia i nie warto się tu kłócić nad tym "czy znak { jest bardziej czytelny niż :" itd bo to nie ma sensu - kwestia gustu. Ale proszę przykład - wiadomo, że opt wygrywa
OPT:
Kod
<p class="tags">
    <opt:section="tags">
        <a parse:href="$tag.url">{$tag.name}</a>
    </opt:section>
</p>


PHP:
  1. <p class="tags">
  2. <? foreach($tags as $tag):?>
  3. <a href="<?=$this->url($tag['url'])?>"><?=$tag['name']?></a>
  4. <? endforeach; ?>
  5. </p>


Ale teraz czy w opt mogę sobie zrobić cos analogicznego do tego?
  1. <a href="<? foreach($tag['relates'] as $tr) if(strpos($tr, 'test') !== false) echo $tr; endforeach; ?>">

Chyba trzeba by było zrobić to przed tym linkiem i o ile dobrze pamiętam dodać strpos (abstrahujmy od tego czy to strpos czy inne funkcje) do listy funkcji co jest dla mnie ogromnym utrapieniem.

No i z tego jest jeden morał. Korzystasz z szablonów w php to nie tworzysz sobie żadnych ograniczeń, które każdy inny system szablonów będzie posiadać.

P.s. Bardzo proszę pamiętać, że opisuję tutaj swoje subiektywne odczucia i w żaden sposób nie traktujcie tego jak atak na OPT czy inne. Po prostu czysty php daje mi wolność za niewielką cenę. A skoro nie widać różnicy to po co przepłacać smile.gif
Zyx
O panie, OPT 1.x, a OPT 2.x to dwie zupełnie różne bajki. Równie dobrze mógłbyś się czepiać, że w PHP3 nie było klas abstrakcyjnych biggrin.gif.

E_NOTICE jest domyślnie wyłączany przez wiele systemów szablonów na czas wykonywania (nawet takich, gdzie pisze się w PHP). Sprawdzanie w kółko czy coś nie jest puste wcale nie jest szybsze, a udowodnił to Smarty 3, gdzie postąpiono w taki sposób i szablony wykonują się dwa razy wolniej. Ponadto jak Ci to przeszkadza, OPT akurat daje możliwość ustawienia innego trybu raportowania błędów na czas wykonywania szablonu...

Konkatenacja -> przecież w OPT był i jest operator konkatenacji. OPT robi z kropki mądrzejszy użytek niż PHP, a jak nie patrzyłeś do dokumentacji, ani nawet tutoriala, gdzie chyba każdy pokazywał, do czego kropka służy, to już jest to Twój problem.

Konieczność tworzenia listy używanych funkcji -> bo szablon nie jest od tego, by w nim korzystać z dowolnej funkcji. Potrzebny Ci mysql_connect() tam? OPT 2.x ma dużo bardziej rozbudowaną listę funkcji domyślnych i np. ja jedyne, co podpinam, to router do generowania URL-i, a tak korzystam wyłącznie z domyślnych funkcji i instrukcji. Nawet w rozbudowanym projekcie.

Czytelność szablonów -> nigdzie nie powiedziałem, że nie musi dbać. Rozmawiamy o wydajności. Czytelny szablon PHP wymusza konieczność używania wolniejszych konstrukcji PHP. Czytelny szablon OPT dalej pozwala kompilatorowi na korzystanie z szybszych, ale mniej czytelnych konstrukcji PHP.

Cytat
Jeżeli chcesz mieć naprawdę łatwe w użyciu narzędzie (dość uniwersalne) do wyświetlanie bardziej zaawansowanych struktur to w opt tworzysz plugin czyli bądź co bądź również "trzeba przygotowywać w nienaturalny zupełnie sposób, klepiąc kod PHP". Chociażby przykład struktury drzewa.


W PHP klepiesz jedynie algorytm czyli rzecz, do której PHP się nadaje. Kod HTML, do którego PHP się nie nadaje, zostaje cały czas w szablonie, czego nie można powiedzieć o helperach pisanych dla szablonów PHP. Jedyne instrukcje w OPT 2, które generują jakieś statyczne wyjście, to opt:prolog oraz opt:dtd (a i tu nawet niekoniecznie) z oczywistych powodów. Ani jedna poza tym nie zakłada, że np. pole formularza musi być w znacznikach DD/DT, że drzewko musi być na liście UL, a na OL nie może, że okruszki są renderowane na bazie listy UL, że błąd to znacznik DIV z klasą "error" itd. Helpery dla PHP mają takie rzeczy zaklepane na sztywno i żeby je zmienić musisz albo obiektowo informować, że ma być inny znacznik, albo przepisać cały helper. Nie pisz, że przecież jak piszę, to wiem, czego potrzebuję, bo prawda jest taka, że:
- Nie muszę wiedzieć, jaki layout ostatecznie dostarczy grafik.
- Jak używam frameworka, to tam helpery już .

Ponadto OPT 2.x ma już tyle gotowych rzeczy zaimplementowanych (a w 2.1 będzie jeszcze więcej), że naprawdę coraz ciężej już znaleźć sytuację, gdzie czegoś brakuje i człowiek jest zmuszony do napisania własnej instrukcji.

Prosisz o kilka przykładów, ok:

Kod
<opt:snippet name="loopBody">
  <h1>{$item.title}</h1>
  {$item.data}
</opt:snippet>

<!-- wyrenderuj listę 1 przy pomocy predefiniowanego wcześniej kodu -->
<opt:section name="list1" opt:use="loopBody" />

<!-- wyrenderuj listę 2 przy pomocy predefiniowanego wcześniej kodu -->
<opt:section name="list2" opt:use="loopBody" />

<!-- wyrenderuj listę 3 przy pomocy predefiniowanego wcześniej kodu -->
<opt:section name="list3" opt:use="loopBody" />

<!-- wyświetl pojedynczy element ze zmiennej $item przy pomocy predefiniowanego wcześniej kodu -->
<opt:insert snippet="loopBody" />


Snippet można umieścić w oddzielnym pliku TPL i dalej nie będzie to mieć żadnego wpływu na wydajność, a kod jest tak samo szybki, jak wtedy, gdy treść sekcji jest określona explicite.

Renderowanie drzewka:

Kod
<opt:tree name="tree">
<opt:list>
  <ul>
    <opt:content />
  </ul>
</opt:list>
<opt:node>
   <li>{$tree.text}
     <opt:content />
   </li>
</opt:node>
</opt:tree>


Wszystkie helpery we frameworkach, jakie widziałem do tego problemu, opierają się na rekurencji, co oznacza, że głębokość takiego drzewka jest ograniczona i w dodatku zależna od projektu (w jednym widok może być odpalany płycej, w drugim głębiej, przez co mamy mniej stosu do dyspozycji). OPT posiada algorytm iteracyjny, więc można nawet drzewo o głębokości 1000 wyrenderować, a od wersji 2.1 będzie można go nawet wymieniać (i będzie ich więcej) bez zmiany szablonu.

Instrukcje dynamiczne w dużej części zależą od tego, jakiego formatu danych się do nich użyje, ale np. sekcja na danych tablicowych:

Kod
<opt:section name="foo">
  <p>{$foo.item}</p>
</opt:section>


kompilowana do szybszej pętli for, a nie foreach. Od wersji 2.1 OPT potrafi optymalizować zwykłe wyrażenia, a także określać, kiedy warto użyć zmiennej tymczasowej, a kiedy nie.

Mi osobiście się nic nie zlewa w składni XML (a nawet więcej: wolę, by instrukcje były dyskretnie pochowane, niż żeby mi się poniewierały tak, że nie widzę nawet, gdzie mam w znaczniku symbol <, a gdzie >. Ponadto klamerki są wciąż zachowane dla wyrażeń w tekście statycznym, jako że standard XML nie zabrania przetwarzania treści statycznej, jak to niektórzy "znawcy" mi kiedyś sugerowali. Ponadto XSLT jest też w dużej części nastawiony na obróbkę danych, OPT koncentruje się na wyświetlaniu. Dlatego podany przez Ciebie ostatni przykład jest niezgodny z filozofią OPT, ponieważ ja zakładam, że szablon dostanie już przefiltrowane dane. Nawiasem mówiąc co niby ten kod ma robić, poza tym że coś robić z URL-em?

Przykład z pętlą:
- Zgubiłeś instrukcję warunkową, która sprawdzi czy dane faktycznie są tablicą.
- Ja mam <? wyłączony na serwerze, więc guzik uruchomię, a nie szablon smile.gif.
- Masz na sztywno powiedziane, że tag jest tablicą. A ja będę chamski, użyję Doctrine i powiem, że w tym miejscu potrzebuję hydrację do obiektów, ponieważ coś chcę jeszcze na tym wykonać. tongue.gif W innym miejscu zrobisz obiekt, a ja znów będę chamski i stwierdzę, że tam jednak obiektów nie potrzeba i chcę mieć hydrację do szybszych tablic. Przykład z życia wzięty smile.gif.
- Brak ochrony przed HTML injection.
- Muszę pamiętać, że metoda X dostępna jest przez $this, Y jakąś inną drogą, Z jest metodą statyczną, A zwykłą funkcją...

Ograniczenia posiada każdy język. W PHP nie zrobisz łatwo czegoś takiego:

Kod
<opt:if>
  <opt:condition test="$warunek1">
    <p>Warunek 1</p>
  </opt:condition>

  <p>Treść bezwarunkowa</p>

  <opt:condition test="$warunek2">
    <p>Warunek 2</p>
  </opt:condition>
  <opt:condition test="$warunek3">
    <p>Warunek 2</p>
  </opt:condition>

  <p>Treść bezwarunkowa</p>

  <opt:else>
     <p>Alternatywa ostateczna</p>
  </opt:else>
</opt:if>


W przypadku OPT nie ukrywam, że np. pisanie w nim algorytmu Dijkstry będzie w nim okrutną męczarnią. Ja wyznaję zasadę, że wolność to nie samowola, a skoro nie samowola, to są pewne reguły. Pewne reguły mówią, że pewnych rzeczy w szablonach się nie robi, a jeśli już, to nie chcę wiedzieć, że one się robią. Stosuję się do tego ściśle, dlatego nie mam problemów z tym, że nie mogę sobie silni policzyć między jednym, a drugim tagiem (no dobra, w sumie z opt:repeat da się to prosto zrobić tongue.gif), ponieważ uważam, że to jest sprawa innej warstwy abstrakcji.

PS. Podbijam poprzeczkę smile.gif

Kod
<p class="tags">
    <opt:section="tags" order="desc">
        <a parse:href="$tag.url">{$tag.name}</a>
    </opt:section>
</p>
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.