OPT (Open Power Template)
Od dłuższego czasu przymierzałem się do zastąpienia Smarty innym systemem szablonów (głównie z uwagi na brak informacji o przejściu na PHP5). Pobieżnie przejrzałem listę dostępnych systemów w internecie i postanowiłem sprawdzić nasz rodzinny produkt OPT (Open Power Template).
Pomimo dość podobnej składni do Smarty przerobienie szablonów na Open Power Template trochę trwało i postanowiłem podzielić się z Wami napotkanymi przeze mnie problemami i uwagami. Koniecznie muszę dodać, że istnieje dodatek do pomocy OPT, który zatytułowany jest "Migracja ze Smarty", ale tak szczerze powiedziawszy bardziej skupiono się na nazewnictwie i jakiś szczegółach technicznych, w które na początku nie zamierzałem się zagłębiać. Interesowały mnie głównie różnice, co muszę zmienić by to działało, ale ich nie znalazłem.
Pierwszy mój błąd pojawił się przy instrukcji include.
{include file="incTop.tpl"}
Unexpected token: OPCODE_OPERATOR (/) in expression ...
W dokumentacji jest napisane, że nie można użyć cudzysłowu bo nazwa pliku jest wyrażeniem (cokolwiek twórcy mieli na myśli, przykładu, wyjaśnienia brak) i trzeba użyć dodatkowo apostrofu.
{include file="`incTop.tpl`"}
Dalej chciałem sprawdzić w jaki sposób Open Power Template reaguje na niezdefiniowane zmienne - nie reaguje. Powoduje to trudności z głupimi błędami typu literówki, czy zostawiona niepotrzebna zmienna, której nie sposób w prosty sposób wyłapać. Padłem ofiarą tego podejścia bardzo szybko przy foreach i zamieszaniu ze zmiennym zewnętrznymi i wewnętrznym, o których wspomnę dalej. Coś się nie wyświetla, a błędu nie ma, sytuacja lekko deprymująca.
Kolejny problem był przy funkcji in_array(), która w Smarty jest domyślnie dozwolona, w OPT trzeba ją zarejestrować.
Zmienne zdeklarowane w szablonie mają zamiast '$' na początku '@'. Jest to podyktowane troską, aby użytkownik w szablonie nie nadpisał zmiennej wcześniej do niego przesłanej. Osobiście mnie to nie przekonuje dla mnie to wprowadzenie niepotrzebnych dodatkowych znaczników.
Domyślnie w OPT nie ma żadnych wbudowanych funkcji, które możemy znaleźć w Smarty jak date_format czy nl2br. Napisanie tego nie stanowi żadnego problemu za to nie rozumiem koncepcji, która wymusza by katalog, który wskażemy by zawierał wtyczki (plugins), posiadał prawa do zapisu. Jeśli ma być jakiś cache to wolałbym by to się zapisywało tam gdzie kompilacja szablonów. Im mniej miejsc z prawami zapisu tym lepiej.
Ostatnią rzeczą, do której się przyczepię to dokumentacja. Niestety nie ma pełnej polskiej dokumentacji. Poza tym bardzo przyzwyczaiłem się, że poszczególne podstrony w PHP czy Smarty posiadają na dole linki do tematów powiązanych. Niestety tutaj tego zabrakło.
Trochę ponarzekałem, ale co na plus? Oczywiście PHP5. Zrezygnowanie z modyfikatorów i bloków, które występowały w Smarty. Wbudowane wsparcie dla wielojęzycznych stron. Coś jeszcze? Okażę się w przyszłości.
Słowa kluczowe: Szablony, Techblog, open power template, opt, smarty, szablony, artykuł, blog

Komentarze i opinie
od tego jest widok żeby nie babrać się w szablony! :D Oj Paweł, nie narzekałbyś wtedy na brak jakiegoś rejestrowania funkcji czy cuś :D
Wolę się babrać w rejestrowanie funkcji niż ciągle otwierać <?php i zamykać ?> ;)
Poza tym zatrudnię jakiegoś młodego programistę, a ten mi wpakuje do widoku jakieś cuda, trzeba dmuchać na zimne ;)
php devblog - ja osobiscie wole mimo wszystko <?php ?> niz pieprzenie sie z OPTem, Smarty czy innym szajsem tego typu ;)
mam bardzo prosty system - FVC kontroluje akcje, akcje kontroluja szablony, szablony kontroluja wyglad. akcji nie obchodzi, co wymysli szablon, chce jedynie okreslone, konkretne dane, wiec moge dla kazdego wygladu cos innego i tak np w wersji mobile bede mial cala rejestracje na 1 stronie, a w wersji na normalne komputery juz z podstronami. prawdopodobnie bedize jeszcze wersja AJAX bedaca polaczeniem obydwu ;)
@D4ky: opis Twojego systemu nie ma nic do systemu szablonów :P
sf - jak to nie?
Pewnie nie słyszałeś o PHPTAL. Szablon ma strukturę XML i domyślnie zabezpiecza wszystkie dane. http://phptal.pl
A dowiedziałem się od pornela: http://pornel.net/szablony
Słyszałem, ale nie jestem w stanie stwierdzić (z przyczyn czasowych) czy podołał by wszystkim zadaniom.
Np. nie widzę w jaki sposób dołączyć w środku szablonu jakiś inny szablon (include). Chce dołączyć jakiś szablon z dodatkowymi parametrami (include size='big'). Chce zrobić jakiś bardziej skomplikowany if (np. if($exists and in_array($row, $permissions) ... ). Dużo pytań, a brak przewodnika do migracji.
No tak, co migracji brak przewodnika. Ale wstawki php można robić.
<div tal:replace="structure php:file_get_contents('plik.html')" />
Wiem, upieram się.
Takie dołączanie chyba odpada, czy jest parsowany po wgraniu przez system szablonów ten plik.html ? ;)
Jeszcze jedna sytuacja np. mamy pętlę foreach i w środku niej mamy jakieś warunki if, czy taka duża dynamizacja w tym systemie istnieje?
Wydaje mi się, że przy użyciu tego typu szablonów należałoby zdecydowanie więcej i dokładniej przygotować dane po stronie akcji.
Przy wstawce php system nie ma nic do mówienia. Po prostu wstawia do szablonu kod php.
Użyłem file_get_contents() bo mi było łatwiej :-) include zwraca bool a nie tekst, więc trzeba by napisać do tego wrapper.
Pętla foreach() jest prosta:
<ul tal:repeat="obj objects"><li>${obj}</li></ul>
Z if-ami może być różnie. Jeśli operują na danych to raczej powinny być wykonane przed szablonem. Ale jesli mają pokazać/ukryć element:
<a href="${www}" tal:omit-tag="www" tal:content="text" />
@sf: No trochę ponarzekałeś :P A o bardzo dobrej wydajności OPT, konfiguratorze zapomniałeś? :>
Wyrażenie w OPT może zawierać zmienne. Dzięki temu możliwe jest wstawienie do adresu pliku zmiennej (np wrzucenie tego do sekcji).
Co do XML-a, OPT wspiera go natywnie (nie sprawdza poprawności, przez co można mieszać obydwie składnie. Autor OPT pracuje właśnie nad kompilatorem, który w pełni obsłuży składnię XML.
OPT używam już prawie rok i jestem zadowolony. Znacznie bardziej zadowolony niż wymyślanie własnych głupich klas, helperów itd... Czasem braki w dokumentacji można zrównoważyć przeglądaniem kodu, który jest jasno nazwany i skonstruowany.
Ogólnie, polecam wszystkim OPT :).
http://zyxist.com - blog autora OPT, można sobie sporo poczytać o jego rozwoju (OPT, nie bloga :P).
Taka jest prawda, że systemy szablonów to już przeżytek.
Kiedyś wszyscy się zachwycali, używali Smarty, Flexy czy innych rzeczy.
Okazało się, że w niektórych momentach szablony sobie nie radzą, na dodatek okazały się mało wydajne.
Obecnie jest tendencja do tego co zaleca Zend, czyli wstawki <? ?>.
Co do śmiecenia...Zawsze coś można na babrać, od tego jest dyscyplina.
Nie wiem jak OPT, ale w Smarty wiele razy spotkałem się, że bardziej utrudniało, bo nie pozwalało czegoś zrobić, niż pomagało.
Parę sprostowań:
1. w sprawie problemu z include - chodzi o to, że ten cudzysłów nie jest częścią wyrażenia w nim zawartego, tylko elementem samego znacznika. Dlatego trzeba dodać coś dodatkowego w przypadku osadzania stringa. Mnie też to lekko denerwuje, ale za wiele tu nie mogłem zrobić na obecnym kompilatorze. W OPT2 będzie to porządnie rozwiązane poprzez przestrzenie nazw. Dodam jednak, że jak chcesz pojedyncze słówko wpisać, to jest to poprawnie rozpoznawane z kontekstu, czy to ma być operator, czy ciąg tekstowy.
2. Jak to "w OPT nie ma żadnych wbudowanych funkcji"?! Czy ja o czymś nie wiem? :D Są, w liczbie 13 co prawda, ale są, są i jeszcze raz są. 13 !== 0.
3. To, że w OPT jest podział na $bloki i @zmienne nie oznacza, że tych pierwszych nie można nadpisywać i tworzyć w szablonie - operacja {$cos is 5} jest jak najbardziej dozwolona.
Ponadto taka uwaga: zamiast "foreach" używaj sekcji - po to kod ich kompilacji zajmuje ponad 1/3 pliku opt.instructions.php, aby się z nich wygodniej korzystało i tak jest faktycznie. W swoich szablonach mam tylko i wyłącznie sekcje i żyję :). Przy okazji znacznie mniej jest okazji do popełnienia błędów itd.
Zgadzam się w 100%, że dokumentacja jest nienajwyższych lotów, ale do OPT2 robię ją już równo z rozwojem kodu, jednocześnie po polsku i angielsku. Tak w ogóle to dzięki za parę nowych pomysłów do nowej wersji:
1. Katalog z pluginami - faktycznie, w "compile" będzie to lepiej trzymać.
2. Tematy powiązane - ok, poszukam odpowiednich opcji w Docbooku i to dorobię.
3. Zestaw funkcji - w OPT2 zostanie dość znacznie poszerzony.
4. Niezdefiniowane zmienne - najlepiej chyba będzie, jak się doda konfigurowalny poziom raportowania błędów na czas wykonywania szablonu, wtedy każdy będzie sobie mógł ustawić tak, jak mu pasuje - ty sobie weźmiesz z E_NOTICE, ja bez nich i załatwione.
Matipl -> to, czy sobie nie radzi, czy jest mało wydajny, zależy raczej od konkretnego systemu szablonów. W kwestii składni zgadzam się, że dużo zależy od piszącego. Jeden ma ładny styl pisania, inny nawet najpiękniejsze narzędzie zmieni w trudny do utrzymania koszmar. Ale składnia też ma znaczenie, z tym, że nie można jednoznacznie powiedzieć, która jest najlepsza. Są ludzie, którym wygodniej pisać <?php echo $costam; ?>, są ludzie, którzy wolą {$costam}. W niektórych miejscach przemyślany czysty PHP jest górą, w innych jakiś system szablonów jest na tyle sprytnie zaprojektowany, że PHP się może schować - kwestia wyobraźni programisty. W OPT staram się iść właśnie w tym drugim kierunku.
Ogółem - thx Stormfly za wzięcie OPT na tapetę.
Nowy komentarz