Neobsahuje názory Henryka Laholy

Šablonový systém nebo přímo PHP?

Je šablonový systém v PHP dobrý nápad nebo naprosto zbytečná mezivrstva? Používat tedy šablonové systémy? A kdy?

Je smutnou realitou, že téměř na každou otázku v IT lze odpovědět "jak kdy". Ještě smutnější realitou jsou houfy zastánců Jediné Univerzální Pravdy Pro Každodenní použití, ale to je jiný příběh. Každopádně mírný oportunismus je v těchto věcech na místě (někdy i větší, to záleží na příležitosti).

Ale to jsem se zas zakecal. Šablonové systémy: Asi nejznámější PHP šablonový systém je Smarty, který je propracovaný, silný, známý, dostatečně rychlý, jednoduše použitelný (říkají jedni), nakynutý, zbytečně složitý, se zbytečným množstvím funkcí a nedostatečně rychlý (říkají druzí). Další šablonové systémy kombinují tyto atributy v různém poměru nakynutosti, možností, síly, schopností, ...

S rozmachem frameworků (každý schopnější PHP programátor si už alespoň čtyři napsal, že?) se objevil názor, že používat šablonový systém ve frameworku je nesmysl, protože, a teď cituji názor některých lidí, PHP samotné je vlastně velmi silný šablonový systém. To mají pravdu, otázka je, jestli je rozumné / vhodné / bezpečné v obecném frameworku rezignovat na nějakou mezivrstvu mezi PHP a HTML a říct: Použijte PHP, je to šablonový systém.

Osobně se domnívám, že do obecného PHP frameworku šablonový systém patří. Proč?

1. Šablonový systém vynucuje oddělení logiky od vzhledu. To je vlastnost v převážné většině případů pozitivní. Pro one-man-show projekty není takové oddělení naprosto nezbytné a programátoři rádi často podlehnou dojmu, že dokáží udržet v hlavě celý projekt a povědomí o tom, co si kde nadefinovali a odkud co kde volají. Na druhou stranu čas, ušetřený přístupem "fláknu to tam kde to zrovna potřebuju" je krvavě zaplacen při změnách kódu, nemluvě o případu, když k vašemu kódu přijde někdo po čase (někdy i vy sami). U projektů, na nichž dělají dva či více lidí a kde je "HTML kodér" jiný člověk než "PHP programátor" vyplyne oddělení logiky a vzhledu dřív nebo později přímo ze stylu práce. PHP framework pro všeobecné použití by měl podporovat tento způsob práce, pokud má být vhodný pro nasazení v solidnějších projektech.

2. HTML kodér by neměl mít možnost nějaké vlastní přehnané kreativity v PHP a v logice. Teoreticky mu musí stačit foreach, echo a html_special_chars. Pokud zvládne takto sám sebe omezit, tak není problém. Samosebou to časem zase svádí k tomu, že programátor hrábne do "HTML části" a něco tam přímo na místě "zazáplatuje" a štábní kultura jde do dža. Podle mého je lépe mu nejen takový přístup zakázat interními pravidly, ale pokud možno ani nepovolit.

3. Naprosto nezbytný je šablonový systém v případech, kdy je projekt navržen tak, že umožňuje uživatelům zvnějšku měnit vzhled (blogovacími systémy počínaje a komunitošmejdo servery konče). V takovém případě je přístup "PHP je vlastně šablonový systém" smrtící. Ale pokud chcete, prosím. Jen nezapomeňte odfiltrovat kromě všech fopen, readfile, ... funkcí i eval(). Já bych za takový systém ale ruku do ohně nedal a svoje data bych mu nesvěřil.

PHP je sice taky hen ten šablonový systém, ale pokud plánujete udělat cokoli jiného než jednouživatelský jednomužný projekt, tak je alespoň minimální šablonová mezivrstva rozhodně dobrá volba. To je můj názor.

Dne 10.06.2008

Twittni

Přidej do: Přidat na Conota Linkuj si ! asdf.sk StumbleUpon Toolbar Stumble It!

Komentáře

[1] (duf [openID] - Mail ) 10.06.2008, 14:38:47 [X] [D]
na to se neda rict snad nic jineho nez "amen"! ve firme jsme si mnohokrat vyzkouseli, ze dokud kazdy dela to sve, tak se to jakz takz da, ale jakmile maji lide moznost hrabat si do veci navzajem, je to opravdu prusvih.

takze z meho pohladu, sablony jednoznacne ano!

[2] (Jens - Mail - WWW) 10.06.2008, 17:02:19 [X] [D]
Mám zkušenosti z několika projektů, které rozhodně nejsou jednomužné ani jednouživatelské a myslím že například v Zendu, konkrétně komponenta Zend_View obstarává za použití PHP funkci šablonovacího systému zcela regulérně. Programátor se navíc nemusí učit žádný další "pseudo jazyk" a vše je navíc o krapet rychlejší. Proto se závěrem autora v obecné rovině nesouhlasím.

[3] (Hds ) 10.06.2008, 18:12:26 [X] [D]
No já nevím. Zkoušel jsem asi bilión různých šablonovacích systémů, pár jsem si jich i sám naprogramil, ale nakonec, po tom všem... jsem skončil u PHP. Teda nemíchám PHP+HTML, do prezentační vrstvy jdou pouze data, která mají, a v šabloně samotné se pracuje pouze s nimi, žádná business logika. Osobně nevidím, jaký je rozdíl např. mezi:

{{ foreach x as y }}

a



Že je to první čitelnější? čistější? víc in? víc cool? Nevěřím... Navíc, při použití PHP šablon odpadá nutnost šablony kompilovat do PHP kódu (ve kterém už jaksi jsou), caching (ten se děje jinde než v šablonách) atd... Prostě nevidím žádný PODSTATNÝ důvod, proč do toho všeho tahat ještě další pseudo-jazyk.

[4] (Hds ) 10.06.2008, 18:13:04 [X] [D]
Sakra, to mě taky mohlo napadnout že PHP kód mi to nepustí :-)

[5] (http://openid.cz/villlem - Mail ) 10.06.2008, 19:47:11 [X] [D]
[3] Jo to vše v případě, že se můžeš spolehnout na své spolupracovníky, že aktuální problém jaksi "nezalepí" v prezentační vrstvě (nebo pokud máš možnost to jednoduše kontrolovat). Takové řešení používám tehdy, když něco dělám sám, nebo se spolehlivými lidmi.

[6] (danaketh - Mail - WWW) 10.06.2008, 19:49:03 [X] [D]
Jsem pro šablony. Nicméně jsem si musel napsat vlastní systém, protože jsem se vždycky někde zasekl na problému, kdy systém neuměl co jsem chtěl nebo to dělal jinak než jsem chtěl. Teď mám vlastní, velice primitivní šablonový systém (tzn umí to přesně co zrovna já potřebuju) a jsem spokojen :)

[3] Takhle řeknu kodérovi ať mi udělá šablonu v HTML podle daných pravidel a mám klid. Jediné kde může být chyba je samotné HTML (resp XHTML) a to neohrožuje funkčnost webu nijak zásadně a snadno se to hledá. Kdyby měl kodér šablony (sice si většinou stejně všechno píšu sám ale občas není čas nebo chuť) dělat ještě něco s PHP, tak bych asi v noci nespal :) Hlavní výhody to ale přináší asi právě jen v případě, že šablony má dělat někdo jiný.

[7] (petiar - WWW) 10.06.2008, 19:59:33 [X] [D]
Súc zamilovaný do Smarty súhlasím s autorom článku.

[8] (karf [openID] - Mail - WWW) 10.06.2008, 20:06:25 [X] [D]
Stará známá písnička :) Vidím jediný pevný argument pro nePHP šablony, a tím je zmíněná potřeba omezit možnosti implementátora šablon. Pokud existuje možnost, že se k šablonám dostane diletant-sabotér-amatér, pak je legitimní požadavek na nějakou bezpečnou šablonovou vrstvu. Nejsem si už jistý, zda takovou vrstvou je např. Smarty. Jinak si myslím, že typicky stejně šablony implementuje programátor a ne HTML kodér (alespoň dle mých zkušeností - pokud jsou tyto role odděleny), a pak je použití PHP šablon přirozenější.

[1] nevidím souvislost mezi "hrabáním si do věcí navzájem" a šablonovacími systémy vs. PHP

[9] (Tom ) 10.06.2008, 21:02:29 [X] [D]
Kdyz kdysi jeste nebyly tak rozsirene frameworky, pouzival jsem Smarty a nemohl si ho vynachvalit. Hlavnim duvodem bylo oddeleni prezentace dat od logiky. Naopak jsem se nikdy nedostal do situace, kdyby v tymu bylo treba nekoho omezovat v pristupu ke kodu stylem, jaky se u Smarty naznacuje.

Ovsem s prichodem frameworku MVC stylu tato potreba oddeleni zmizela - jsou oddelene jiz automaticky. A prestoze smarty zastupujici vrstu pohledu, sve sablony kompiluje do php, prijde mi to jiz jako nepotrebny krok.

Muj nazor tedy jest, ze sablony maji sve misto pouze tam, kde jde o tak malou zalezitost, ze se nevyplati nainstalovat framework. A vzhledem k frameworkum typu kohana,... pochybuji, ze instalace sablonovaciho systemu bude o mnoho rychlejsi (instalaci myslim cely proces zprovozneni).

[10] (Arthur Dent [openID] - Mail - WWW) 10.06.2008, 22:22:21 [X] [D]
Aha, vše stále stejné. Dovolím si demonstrovat na komentáři [2]:

Programátor se navíc nemusí učit žádný další "pseudo jazyk" - správně. On se ho totiž ani učit nemá, protože HTML NENÍ starost programátora, ale kodéra. Jeho starostí je, aby předal dohodnutým způsobem data, jaká předat má. Tam jeho práce končí, dál je to na kodérovi. A pro kodéra je víceméně šumák, jestli se má učit pár PHP funkcí nebo nějaký pseudojazyk.

[3] Ano, tím je to hezky pojmenované: nemíchám PHP+HTML - A co ostatní členové týmu? Dokud budu na vše ostřížím zrakem dohlížet, tak fajn... Ale hovořím o VĚTŠÍCH projektech, kde platí to co jsem napsal výše: Kodér si píše HTML a na místa dat dává výplň v podobě nějakých speciálních řetězců (netřeba se učit "pseudojazyk", stačí vědět, že tam, kde má být, řečkněme, titulek stránky kodér napíše {titulek} - a není co řešit. Kodér může dál vesele kódovat a ví, že se mu dynamická data objeví tam kde mají, programátor se nemusí starat o nic jiného, než aby jeho skript připravil to co připravit má.

[8] Jinak si myslím, že typicky stejně šablony implementuje programátor a ne HTML kodér - a já si myslím, že to je špatně. To by mohl programátor navrhovat třeba i uživatelské rozhraní, že? Že to leckdy dělají? No, je to taky vidět!

[9] Ano, Kohana je přesně příklad toho, o čem píšu. Koukněme se na http://kohanaphp.com...als/xss.html - čí je to práce? Kodérova? Programátorova? Kdo se má o tyhle věci starat? A není jednodušší, když se o ně postará template systém?

Rád bych připomněl, že v článku nehovořím o jedno-, dvoumužných projektech, kdy "šablony implementuje programátor" a "kodér píše PHP"... Držme se prosím případů, kdy programátor programuje, kodér píše HTML, grafik dělá grafiku a UI navrhuje designér.

[11] (tiso - Mail - WWW) 10.06.2008, 22:31:45 [X] [D]
Mne osobne sa najviac páči tento KISS prístup:
http://www.massassi.com..._engines/
Len nepoužívam short_opet_tags, v každej šablóne píšem zoznam a význam premenných, ošetrujem neoprávnené volanie šablóny, neexistenciu premennej (tam kde to je potrebné) a podobne. Zatiaľ mi stačili echo, if, else, isset, count a foreach. Ale chápem že na niektorý projekt to nemusí byť dostatočné riešenie.
K bodu 3: kontrola šablón cez token_get_all to istí...
Mám jednu otázku: html_special_chars má ísť do šablóny, nie do funkcie ktorá pripravuje dáta pre šablónu? Tam mi pasuje viac...

[12] (Roman - Mail - WWW) 10.06.2008, 22:35:31 [X] [D]
mne staci uplne precitat si toto:

"Powered by Kohana v2.1. Rendered in 0.1093 seconds, using 2.00MB of memory"... o taky framework by som ani bicykel neoprel...

[13] (Hds ) 10.06.2008, 23:07:59 [X] [D]
[10] Pokud je to řečeno takhle, tak souhlasím. Při více lidech v týmu, kdy je striktně oddělena úloha programátorů a kóderů, je to jasné.

Ale přece jenom - já jsem měl napsaný takový jednoduchý systém, který mi umožňoval do šablony napsat třeba:


Hloubka vnoření: {_level}, obsah: {_value}


a skript na to místo vyplivl stromovou strukturu tvořenou vnořenými seznamy, automaticky vytvářel různá pomocná data (třeba tu hloubku zanoření, identifikátor konkrétní položky seznamu apod.). Mojí motivací bylo prostě si ulehčit práci s psaním stejného kódu pořád dokola, a místo toho tam prásknout prostě tag a hotovo. Umělo to i kompilaci do PHP kódu, takže s rychlostí ve finále taky problém nebyl, jenže... Já prostě nevím, jestli tohle je "správné" :-) Člověk se na různých (důvěryhodných) místech dozví naprosto protichůdné názory na problematiku a čert aby se v tom vyznal. Takže já teď jdu zpět ke kořenům a uvidíme co bude za měsíc :-)

[14] (Arthur Dent [openID] - Mail - WWW) 10.06.2008, 23:08:57 [X] [D]
11 Nějak mi nesecvaklo to s token_get_all, čím že to přesně "jistí". Jako že tu šablonu rozebere, vyhodí vše mimo definované tokeny a zase složí "vyčištěné" PHP? Jáááj, do boha, to by mě mohli do ucha milovat! ;)

[15] (Hds ) 10.06.2008, 23:10:08 [X] [D]
[13] Sakra to je podruhý dnes :) Prostě tam má být

{tree items}
Hloubka vnoření: {_level}, text položky: {_value}
{/tree}

akorát místo složených hranaté závorky.

[16] (Arthur Dent [openID] - Mail - WWW) 10.06.2008, 23:14:56 [X] [D]
[13] Proč ne? Ostatně lidi od IT jsou proslulí svou leností a tím, že jsou schopni napsat dvacet tisíc řádků kódu jen proto, aby si v budoucnu ulehčili práci. :) Proto si vymysleli podprogramy (ehm, pardon, funkce) a preprocesory a makra... a komponenty... Řekl bych, že "jeden tag na celou stromovou strukturu" má nejblíž "komponentám". Pokud jsou dobře a robustně navržené a dobře odladěné, tak v jejich použití nevidím zásadní problém. Ostatně, na tomhle přístupu funguje celé IT coby obor. ;)

[17] (tiso - Mail - WWW) 10.06.2008, 23:36:37 [X] [D]
[14] inak som to myslel - ak šablóna bude obsahovať nepovolené funkcie, tak ju systém nedovolí používať.

[18] (David Grudl - WWW) 11.06.2008, 03:53:01 [X] [D]
O tomhle jsem už poměrně dávno mluvil s naším okresním hejtmanem a shodli jsme se na tom.

[19] (karf [openID] - Mail - WWW) 11.06.2008, 09:00:16 [X] [D]
[10] Dovolím si ještě reagovat pouze na toto: "Držme se prosím případů, kdy programátor programuje, kodér píše HTML, grafik dělá grafiku a UI navrhuje designér."

Vytváření prezentační logiky v šablonách má ale mnohem blíže k programování než k vytváření HTML. Právě u vícemužných projektů je to markantnější - ten, kdo implementuje šablony musí znát chování onoho systému, jaké všechny stavy mohou nastat, jaké hodnoty se můžou či nemůžou na výstupu objevit atd. Toto ví přece spíš programátor, který vytvářel aplikační logiku, než kodér, který k vytvoření HTML o tom nemusí vědět nic. Čili zde se asi neshodneme v tom, kdo vytváří prezentační logiku v šablonách. Mé zkušenosti (ano, z vícemužných projektů, ale ne z projektů typu Bloguje) jsou s tímto postupem pozitivní. Jinak UI programátor nenavrhuje, to zde přece nikdo netvrdil.

[20] (Radim Hasalík - Mail - WWW) 11.06.2008, 11:12:50 [X] [D]
Nejsem sice programátor, ale z mého pohledu se mi zatím použití šablonovacího systému více než osvědčilo. Z Brouzdej.cz mám postřeh, že není vhodné řešit HTML v PHP. Máme tam sice šablonovací systém, jenže některé věci jsou pomocí HTML napsány přímo v PHP. To bohužel vnáší nepřehlednost do dalších úprav, takže také doporučuji striktně oddělovat oba jazyky.

Na Zacinej.cz jsem použil Template Power. Smarty mi přišel příliš složitý. Funguje to. Pomalu se ale začínám klonit ke generování statických HTML stránek.

Jeden z mých zákazníků má přístup do testovacího rozhraní, ve kterém si spravuje vlastní stránky. Když úpravu odešle, uloží se do MySQL. Pomocí CRONu je volán zvláštní skript s upraveným Template Powerem. Skript si načte hlavní šablonu, doplní z MySQL požadovanou část a vygeneruje statickou HTML stránku. Tu potom pošle pomocí FTP příkazů na server klienta.

[21] (Arthur Dent [openID] - Mail - WWW) 11.06.2008, 11:21:58 [X] [D]
[19] ten, kdo implementuje šablony musí znát chování onoho systému, jaké všechny stavy mohou nastat, jaké hodnoty se můžou či nemůžou na výstupu objevit atd. - a to je argument pro co? Pro to, že by kodéři měli mít přístup k PHP nebo pro to, že by kód měli psát programátoři? Já osobně to čtu jako argument pro to, že by kodér s programátorem měli umět dobře spolupracovat a navzájem si rozumět. ;)

Mám s tím velmi dobré zkušenosti... Kdyby nic jiného, tak programátor si při snaze vysvětlit někomu jinému to na čem dělá projde znovu svůj vlastní návrh a najde v něm případné díry. ;)

[22] (Arthur Dent [openID] - Mail - WWW) 11.06.2008, 11:40:49 [X] [D]
[20] Ano, to co popisuješ na konci je výborná věc. Autoopravna nepotřebuje mít stránky poháněné PHPčkem a databází...

BTW, tak jsem ti zjistil, že sedím v jedné kanceláři s programátorem Brouzdej... ;)

[23] (Tonda - Mail - WWW) 11.06.2008, 13:17:46 [X] [D]
Já jsem jednoznačně pro šablonovací systémy. Smarty používám i u sebe na blogu, i když tam by se to zrovna asi dalo považovat za zbytečné.

Tenkrát jsem ho tam dal spíš proto, abych se s ním naučil pracovat (ostatně celý můj blog = aplikace nově naučených věcí), ale jelikož mě čeká re-design, tak jsem moc rád, že ho tam mám.

http://blog.antonindanek.cz...ocne/

[24] (karf [openID] - Mail - WWW) 11.06.2008, 14:57:36 [X] [D]
[21] To byl argument pro to, aby prezentační logiku řešil programátor. Ale nemám potřebu se o to nějak zuřivě přít.

[25] (Radim Hasalík - Mail - WWW) 12.06.2008, 08:01:14 [X] [D]
[22] Nejlepší potom je, že díky této neznalosti (autoopravna má web s PHP a MySQL; opravdu veselá představa :-)) přichází podnikatelé o další peníze. Platí totiž zbytečně drahý hosting, jejich web může být nedostupný v případě výpadků atd.

Ad BTW) Já vím. Svět je malý. Brácha mi to nadšeně volal. Tak jsem mu říkal, že se od tebe může hodně věcí naučit. Tvoje výhoda jako programátora je totiž v určitém odstupu, brácha je ve svém věku pořád ještě nadšencem.

[26] (Ján Varhol - Mail - WWW) 12.06.2008, 20:17:47 [X] [D]
Úplný súhlas. V predošlej práci som robil html kódera a miestami som sa musel hrať na php programátora kvôli spomínanému prístupu php=šablónovací systém. Bohužiaľ.