Šablony

Školení, která pořádám

U větších projektů je k nezaplacení mít důsledně oddělenou aplikační vrstvu aplikace od té prezentační. Pro nás jako programátory by mělo být cílem, abychom mohli grafikovi nebo HTML kodérovi svěřit část projektu bez obavy, že nám zmrší kód, a naopak aby nás grafik nemusel žádat o spolupráci kvůli jakékoliv změně, které se týká prezentace dat.

Řešením tohoto úkolu by mohlo být XSLT – programátor vygeneruje v podstatě libovolné XML a grafik si ho převede jak chce pomocí XSLT. Problém je v tom, že většina HTML kodérů XSLT neumí a učit se ho nechtějí, protože jim to příliš připomíná programování. Proto se spíše používá řešení založené na rozličných šablonovacích systémech. To funguje tak, že programátor v kódu jenom naplní PHP proměnné, grafik vytvoří šablonu, která tyto proměnné využívá, a šablonovací systém to celé poskládá dohromady.

Další velkou výhodou šablonovacích systémů je to, že pokud neřeknete jinak, tak jsou všechna vypisovaná data automaticky escapovaná, takže nehrozí nebezpečí XSS.

Jeden z nejoblíbenějších šablonovacích systémů je Smarty. Já osobně ho moc rád nemám, protože podle mě dává grafikovi do ruky až moc silnou zbraň. Oblíbil jsem si proto spíše HTMLTmpl, který podle mě umožňuje přesně to, co by umožňovat měl – nic míň a hlavně nic víc. V Česku je oblíbený také Teng původně vyvinutý Seznamem.

<?php
require "htmltmpl.php";
$manager = new TemplateManager();
$template = $manager->prepare("template.tmpl");
$tproc = new TemplateProcessor();

$tabulka = array();
$result = mysql_query("SELECT id, nazev FROM tabulka");
while ($row = mysql_fetch_assoc($result)) {
    $tabulka[] = $row;
}
mysql_free_result($result);
$tproc->set("tabulka", $tabulka);

echo $tproc->process($template);
?>

Soubor template.tmpl je potom běžný HTML soubor doplněný speciálními značkami. Proměnná $tabulka by se zpracovala např. takto:

<TMPL_LOOP tabulka>
	<li><a href="?id=<TMPL_VAR id>"><TMPL_VAR nazev></a></li>
</TMPL_LOOP>

HTMLTmpl jsem si předělal tak, že do cache ukládá přímo nativní PHP kód. Upravenou verzi lze stáhnout ze SourceForge.

U svých soukromých projektů šablony obvykle nepoužívám, je s tím přeci jen trochu práce navíc – musí se vytvořit víc souborů a musí se správně poslepovat. U projektů, na kterých pracuje víc lidí nebo u kterých se do budoucna počítá se změnou designu bez potřeby měnit i PHP kód, jsou naopak šablony ten pravý nástroj.

Pokud vám žádný šablonovací systém nevyhovuje a máte nutkavou potřebu si napsat vlastní, vyjděte prosím alespoň ze syntaxe některého stávajícího.

Jakub Vrána, Seznámení s oblastí, 18.5.2005, diskuse: 65 (nové: 0)

Diskuse

xfish5:

Nebo se to dá řešit jen pomocí regulérních výrazů + nějaké funkce pro nahrazování v textu(str_replace(),...). Nebo to potom celé zabalit do třídy... Já to mám <%posledniKomentare(2)%> a pak to pomocí reg. výrarů a té funkce nahradím...:-)

Llaik:

No osobne si myslim, ze veci jako podminky ci treba modifikatory by mel do ruky dostat HTML koder a ne programator. Napriklad omezeni delky textu napr. pro title obrazku preci neni zalezitost pro aplikacni cast aplikace (ta ma title nacist treba z db), ale pro prezencni cast (zobrazim to cele, nebo jen prvnich 20 znaku?)

Jinak Smarty ma ohromnou vyhodu, kterou skoro nikde nevidim zminenou - sablony kompiluje do phpka. Tj. Pokud mate 10 volani stranky za vterinu, tak Smarty nedela jako jine "tupe" sablonove systemy to, ze by 10x nacetl stranku z disku, pomoci regularnich vyrazu ji parsoval a zobrzil. Udela to jen jednou a zkompilovanou verzi ulozi jako php, ktere pri dalsich volanich jen includuje.

Jinak samozrejme nejlepsi (co do vykonu) ze zminovanych je nutne Teng - je to modul pro Apache (coz mimojine znamena, ze pokud nemate ochotnou podporu na webhostingu, pripadne nemate svuj, zrejme si ho neuzijete)

Jinak se sablonami neni vice prace. Aplikacni i prezencni cast musite udelat tak jako tak, takze v cem je to "vice prace"? V tom, ze to ulozite do dvou souboru, misto do jednoho? Videl bych spise paraleru s tim "xhtml nepisu, je to pomalejsi nez html" :)

Zdeněk Merta:

No nemyslím si, že HTML kodér by měl mít možnost omezovat třeba délku textu, ...

Pokud programuješ objektově, tak se tohle dá řešit obdobou Helper tříd v Jave. Jinak speciální šablonovací systém nepoužívám - vystačím si s PHP

př.

<?php
class Article {
    var $title;
    var $body;

    // get, set metody
    ...
}

class
ArticleHelper {
    var $article;

    function &ArticleHelper(&$article)
    {
        $this->article =& $article;
    }

    function getTitle()
    {
        // omezeni delky titulku na 50 znaku
        return TextUtils::limitText($this->article->getTitle(), 50);
    }

    function getBody()
    {
        return $this->article->getBody();
    }
}
?>

Nedefinovaná třída TextUtils obsahuje metody pro práci s textem.

Vytvořený Helper pak jen předám do HTML šablony a v ní volám jeho metody.
Helperů samořejmě existuje více, např. pro seznam článků v rubrice, pro zobrazení článku, ...

ikona dgx:

ono jde o to, že pokud rozdělíme aplikaci na aplikační a prezentační logiku, že by v tom prezentování "nějaká logika" měla být. A pouhé zobrazení proměnných přecijen logika není.

Vidím docela rozdíl v ořezání proměnné v aplikační a prezentační části aplikace. V tom prvním případě by neměla být motivací snaha, aby se titulek kamsi vtěsnal,  ale nějaký prezentačně-nezávislý důvod.

Jan Bien:

ad dgx: Přesně tak, i do prezentační vrstvy patří logika a jde jen o vedoucího projektu, aby zajistil správné oddělení toho, co je ještě věc aplikace a co již prezentace.

Jinak nezapomínejme, prosím, na to, že samotný PHP jazyk je svým původem jazyk šablonový. Pokud se určí přísná pravidla, co v šablonách HTML designer použít smí a co ne, tak je použití PHP pro šablony v PHP aplikacích dobré i výkonné řešení a není třeba zavádět žádný další "pseudojazyk".

Zmíněný teng IMHO nachází uplatnění spíše v nePHP aplikacích (C++, ...) které vůbec možností šablon neoplývají. Krom toho má teng tu výhodu, že jde o jednotný šablonový systém pro více jazykových platforem -- to může být dostatečný důvod i pro použití v PHP aplikacích.

Ale nejsem vývojář, takže někde možná trochu zavádím.

Zdeněk Merta:

Jen je potřeba ta přísná pravidla kontrolovat.
Nevýhodou použití PHP jako šablonovacího systému je možnost vyvolat jakýkoliv příkaz PHP. Dá se to sice různými způsoby omezit, ale bude to na úkor rychlosti.

Jan Bien:

To je fakt. Pokud nedokáži udržet disciplinovanost  HTML kodérů, tak asi nezbude nic jiného, než přistoupit k nějakému jinému systému šablon.

Zdeněk Merta:

Problém je, pokud je to v rámci nějaké firmy, která nedělá pouze v PHP, ale i v jiných jazycích. Tam se hodí TENG, který má ale nevýhodu v nutnosti zakompilování do webového serveru.
Cesta by možná mohla vést tudy: http://www.kuwata-lab.com/kwartz/
Zatím jsem se na to moc nedíval, ale na první pohled to vypadá zajímavě.

Zdeněk Merta:

Máš naprostou pravdu, v prezentační vrstvě se logice vyhnout nedá, ale je potřeba důsledně rozlišovat aplikační a prezentační logiku.

Můj příklad je samozřejmě prezentační logika, čili ořezání je naprosto správné.
Používam návrhový vzor MVC a Helper se vytváří až ve View. Pak se předává šablonovacímu systému a v šabloně se používají už pouze metody helperu a samozřejmě základní jazykové konstrukce PHP jako cykly a podmínky.

Výhoda je v tom, že HTML kodérovi ke každému View přibalím vygenerovanou API dokumentaci k Helperu a hned je mu jasné, jaké metody může použít.
Čili naučí se pouze základní jazykové konstrukce PHP a používání Helperu.

ikona dgx:

když už jste nakousl MVC, dovolím si jeden OT dotaz, snad mi Jakub odpustí :-) Používáte vlastní framework + šablony nebo některý opensource systém?

Zdeněk Merta:

Používám Mojavi http://www.mojavi.org/
Doposud upravenou verzi 2, teď se chystám trošku se seznámit s verzí 3, která je už pouze pro PHP 5.

Speciální šablonový systém nepoužívám, jen PHP s tím rozdílem, že se to tváří jako obvyklý šablonovací systém. Čili data do šablony se předávají pomocí metod šablonovací třídy a v HTML jsou pak dostupná přes proměnnou $template. Tenhle systém jsem používal už dříve a v Mojavi je to výchozí systém šablon. Je ale možné si dodělat podporu pro další systémy. Např. pro Smarty a PatTemplates už myslím existují.

ikona llook:

Pomalu se také přikláním k používání PHP pro šablony. Prostě místo {$name} napíšu <?=$name?> (připomínám, že short_open_tag lze nastavit i na úrovni adresáře)

Nedávno jsem pomocí "pure Smarty" (tj. nešahal jsem na obsluhující skripty) řešil výpis stromové struktury, šlo o komentáře na blogu. Většinou se to řeší jako tady nebo na Intervalu - jednoúrovňová struktura, kde jsou zanořenější prvky více odsazené, ale já chtěl vnořené seznamy. Nakonec se mi to snad podařilo, ale nechtějte vidět zdroják tý šablony ;)

Zajímavá obhajoba PHP jako TE je taky tady, od autora bTemplate (anglicky): http://massassi.com/php/articles/template_engines/

Ad Teng: Používá to někdo kromě Seznamu? To by mě fakt zajímalo, protože všude čtu doporučení a nikde zkušenosti.

Zdeněk Merta:

short_open_tag bych se radši vyvaroval, pokud bys souběžně používal XML, tak se dostaneš do problémů.

Od používání šablon mě odradily diskuze na SitePointu a ten článek, co odkazuješ. PHP šablony mají snad jen samé výhody až na zmiňované zneužití funkcí PHP HML kodérem. Ale není problém si napsat skript, který projde všechny adresáře se šablonami a zkontroluje používání nevhodných příkazů.

Celkem se mi líbil šablonový systém, co jsme používali ve firmě, který používal speciální XML tagy a parsování šablon používalo SAX parser. Implementováno bylo spoustu vychytávek, jako různé barvy sudých a lichých řádků a mnoho dalších.
Jen jsem se nikdy neodvážil měřit jeho rychlost, protože by to asi nebylo nic moc, ale ve spolupráci s cacheováním výsledků to bylo celkem použitelné.

ikona llook:

Všechny XML deklarace v PHP skriptech jsem si zvykl zapisovat takhle: <<?php ?>?xml version="1.0"?>
Je mnohem pohodlnější psát <?='něco'?> než <?php echo 'něco'?> i za tu cenu, že si musím dát pozor na XML deklarace.

DaMage:

a prečo rovno neoddeliť XHTML od akehokoľvek formatovania a vysledok formatovať pomocou CSS...
jediná potrebná vec je aby vystupný dokument mal dobrú štruktúru zbavenú akehokoľvek formatovania (okrem atributu class). Dobrou ukážkou je http://www.csszengarden.com

ikona Jakub Vrána OpenID:

Hlavní důvod je ten, že dobrý programátor nemusí být zároveň dobrý HTML kodér a u větších projektů tyto funkce také bývají rozděleny. Změny v HTML se také mnohem snadněji dělají, když nejsou zamořeny složitým PHP kódem.

DaMage:

Keď som sa nad tym zamyslel, vlastne máte pravdu... keď som pred dvoma týždňami začal písať vlastný projekt, spravil som kód cez čiste XHTML (pozostáva len z elementov div a zákl. formatovania textu, ktoré už je písane, priamo cez web-app, cez WYSIWYG editor), ktorý nešiel priamo k použivateľovi, ale ukladal sa do premennej, na ktorú pred výstupom môže byť ešte aplikovaná XSLT šablona...

tark:

Doporučil bych šablonovací systém TemplatePower, IMHO je skvělý a je napsaný přesně pro to, co člověk potřebuje. Ve spojení s cache_lite...

http://kanevinternetu.blacksuns.net/weblog.…-sablonovaci-system
http://hulan.cz/blog/item/jak-zrychlit-vas-web-10x-konkretni-navod

PHX:

Ja osobne po zprehledneni a usnadneni prace jsem zacal pouzivat sablony. Nakonec jsem si, ale napsal svou ktera umi jen to co chci. Domnivam se ze toto reseni je idealni k odeleni PHP od HTML. Pak napr staci zmenit sablonu a vystup muze byt XHTML nebo WML ci neco uplne jineho... Nebo jen zmenit Desing :)
Moje sablona zatim neni pripravena pro zverejneni, ale jiz ted je schopna funkce. Umi jednoduche nahrazovani TAGU (tvar TAGU [nazev] ) za text. Umi i opakovaci tagy napr pro odstavce ci bunky v tabulkach a dokonce jsem za pomoci Gimli2 zabudoval (vpodstate on) kompresi vystupu.
Muj nazor je ze Sablony jsou supr vec ale 100% bych do ni nemotal nejake programovani a PHP funkce. Sablona ma byt JEN napr HTML +TAGY sablony. NIC VIC!
PS: Az bude sablona zverejnena objevi se info v mem blogu na http://phx.gipix.net

lama:

jsem strašná lama, presto bych hrozne rad nejakou radu, priklad ci clanek o pouzivani sablon.. mam delat projekt v php, ve kterem by zakaznik nemel videt zdrojovy kod a rozhoduji se pro sablony, je to vhodne? diky

ikona Jakub Vrána OpenID:

Šablony na to, jestli zákazník zdrojový kód uvidí nebo ne, nemají žádný vliv. Pozornosti bych doporučoval např. http://www.php.net/bcompiler

@ss@ssIn:

Vy by ste vedeli, jak spravit taky jednoduchy (sablonovaci) system?

Bo la som skusal prezerat kody Smartov, ale po 5 minutach som sa v tom stratil...

Bo xcel by som len taku jednoduchu, com ma cykle (nesom isty jak sa to sklonuje), podmienky a vypsi premennych

ikona Jakub Vrána OpenID:

Nedělej si vlastní systém, ale použij některý z těch jednoduchých, třeba právě HTMLtmpl.

@ss@ssIn:

Ak ked, mne pride aj to brutalne zlozite. Resp. sa v tom stracam (po 500 riadkoch uz neviem kde som)

scippio:

si udělej vlastní jako já .. =)

Tom@sQo:

mno kazdopadne spravit vlastny system s tym najzakladnejsim(staci funkcia assign(premenna_v_sablone, hodnota); viac aj tak netreba)sa da vytvorit(resp. som vytvoril) za hodinu(60 riadkov-10 riadkov komentara)a to som sa este stihol aj najest ;)
nemusis predsa pisat 500 riadkovy aj s prekladanim sablony... a nviem cim este moj system je maly,sice pomalsi, lebo nepreklada(aj ked mozno rychlejsi od smartyho, lebo je o dost mensi[2kb]), ale je moj a mne postacuje :) a co je hlavne, mam uplny prehlad nad kodom systemu, ktory som stvoril ;)

Saell:

Potrboval bych trochu pomoct s PHP-kem. Nenases by sis trochu malo casu ?
ICQ - 49176376

ikona Jakub Vrána OpenID:

ICQ nepoužívám. Pokud potřebuješ pomoci, zkus to třeba na http://diskuse.jakpsatweb.cz/index.php?act…&forum=9.

max@lera:

zatim nej co jsem nasel, je EasyTemplateSystem verze 3.06.,
dynamicke data se davaji do promenne jako objekt a ty jsou pak lahudkou. zadne definovani napr. $obj->assign('promenna', data); ale jednoduse $obj->promenna = data;
jestli mate skusenosti, muzeme si je vymenit.

ikona spaze:

Předávání objektů do šablony je třeba i ve Smarty. Volám Smarty::assign() jen jednou, veškerý data mám v poli (šel by i objekt) a to pak předám do šablony.

ikona spaze:

"Další velkou výhodou šablonovacích systémů je to, že pokud neřeknete jinak, tak jsou všechna vypisovaná data automaticky escapovaná, takže nehrozí nebezpečí XSS."

Můžeš to vysvětlit? Mám totiž takové podezření, že minimálně globálně to neplatí.

ikona Jakub Vrána OpenID:

HTMLtmpl: "All variables are automatically HTML escaped." http://htmltmpl.sourceforge.net/lang.html#statements

Smarty: "By default, the variable is html escaped." http://smarty.php.net/manual/en/language.modifier.escape.php

ikona spaze:

v HTMLtmpl to podle vseho plati (nevim, nepouzivam), ve Smarty to neplati, jak jsi sam ukazal. Ta citace je totiz z modifikatoru "escape", kterej se musi explicitne uvest {$foo|escape}. Takze ta veta "Další velkou výhodou..." rozhodne neplati pausalne (dokud si clovek ne(u|pre)dela assign() tak, jak potrebuje).

K vysvetleni toho "By default..", typ escapnuti totiz neni treba uvadet v modifikatoru, pokud tedy neni uveden, pouzije se typ "html", cili to "by default" plati na modifikator, ne na vsechny prirazeni promennejch.

Hořec:

Nemáte někdo zkušenosti s Fast Template? http://www.grafxsoftware.com/product.php/Fast_Template/26/
Připadá mi lepší, protože dává do šablon opravdu minimum kódu aplikace.

RATMex B:

Čo znamená presne "dává grafikovi do ruky až moc silnou zbraň"?

ikona Jakub Vrána OpenID:

Tím mám na mysli např. http://smarty.php.net/manual/en/language.function.php.php.

RATMex B:

To je dosť nezmyselný argument. Programátor a designér sú ľudia, ktorý spolupracujú a nie ľudia, ktorý by išli proti sebe. Že Smarty umožňuje aj viacej, ako iba výber obsahu premenných neznamená, že to designér zneužije na to, aby spravil programátorovi napriek. Alebo to bolo myslené v inom zmysle?

ikona Jakub Vrána OpenID:

Bylo to myšlené takhle. Hlavní přínos šablon vidím právě v tom, že odstiňují programátora od HTML kódu a designéra od PHP kódu. Pokud odstínění tak silné nepotřebuji, mohu jako šablonovací jazyk použít také PHP - v kódu naplnit proměnné a v šabloně je PHP kódem vypsat.

Techi:

No máš naprostou pravdu, že PHP kód nemá v šabloně co dělat, naštěstí se to dá zakázat. Co jinýho máš proti Smarty? :) Podle mě je Smarty mimořádně pružný, což je právě výhoda a důvod, proč je oblíbenej

Elvard:

Tak, tak, {php} tagy se daji zakazat.
A pokud se do sablony zacne vnorovat vice php a do php vice sablon, tak uz to nema logiku... Nevidel bych to ale jako problem smarty, ale jako problem uzivatelu.

Smarty je prvni sablonovaci system, ktery pouzivam a zatim se mi libi... Na dalsim webu zkusim neco jineho...

Motyl23:

Ahoj, zajimalo by me jestli tenhle sablona resi problem i18n? Reseni tohodle problemu jsem zaznamenal jan u Smarty.

ikona Jakub Vrána OpenID:

Texty k překladu se dají zadávat pomocí [[ ]], navázat to jde na gettext nebo uživatelskou funkci. Např. formát data nebo čísel určit ale nejde.

Norn:

Jakube, padl tady dotaz ohledne Fast Templates. Co si o nich myslíte? Diky

ikona Jakub Vrána OpenID:

Neznám.

Norn:

Mohl bych mít ještě jeden dotaz ohledně šablon? Pokud děláte webovou stránku, kde šablony používáte, jak řešíte to, že šablony nesedí (na jedné stránce tabulka, pak někde obrázek, formulář a tak).
Napadlo mě udělat hlavní stránku (index.php), a podle stránky volat funkci té určité šablony -> mít pro každou šablonu zvláštní funkci. Ale nevím, jestli je to "vhodné řešení".

Díky za odpověď, v PHP nejsem moc dobrý a zatím jen "chytám" zkušenosti.

Ján Koštial:

Umožňujú šablonovacie systémy vnorovanie šablon? Napr. všetky stránky budú mať rovnakú šablonu definujúcu povedzme hlavičku, menu, a pätičku a obsah by sa generoval podľa viacerých šablon      (produkty, služby, ...). ?

ikona Jakub Vrána OpenID:

Obvykle ano.

Ján Koštial:

Hovorilo sa tu o delení logiky na prezentačnú a aplikačnú časť. Na zjednodušenie tvorby prezentačnej časti máme šablónové systémy. Poznáte nejaký framework na zjednodušenie tvorby aplikačnej časti? Najlepšie taký, ktorý pekne spolupracuje s nejakým šablónovým systémom?

ikona Jakub Vrána OpenID:

Podívej se třeba na http://php.vrana.cz/zend-framework.php, možná to je to, co hledáš.

Martin Vlasak:

Jakube, jeste porad pouzivas sablonovaci nastroj HTMLTmpl?

ikona Jakub Vrána OpenID:

Ano.

Martin Vlasak:

Jakube, trochu drze se zeptat, venoval bys mi tvuj opraveny HTMLTmpl o cashe? Martin

ikona Jakub Vrána OpenID:

Pošli mi na sebe kontakt.

hannes:

zdravim panove,

mam problem pri parsrovani XML dokumentu s diaktriktikou (atributy a hodnoty uzlů). Můj xml dokument  ma
<?xml version="1.0" encoding="UTF-8" ?>
a jeste pro uplnost jsem nastvail kodovani pres
xml_parser_create("UTF-8");
Po parsingu je diakritika uplne znicena ... Nemate nejakou zkusenost jak to vyresit (obalovat data do CDATA se mi nezda košér...)
DIKY za navrhy

Jakuje:

Jenom bych se chtěl zeptat jaká je situace s šablonami dnes. Máme vlastní téměř napsanou, ale je to hafo fuška.
Poslední komentář je zde rok a půl zpět a za tu dobu se na internetu určitě změnila spousta věcí.
Díkuji za odpověď.

S.:

Zdravím všechny.. Neuměl by autor napsat podobný výpis stromové struktury, ale se šablonovacím systémem Smarty?

Jan Kahoun:

"HTMLTmpl jsem si předělal tak, že do cache ukládá přímo nativní PHP kód. Upravenou verzi lze stáhnout ze SourceForge."
Koukal jsem na to, funguje to dobre, ale ve funkci htmltmpl_compile_tag() je chyba. V miste kde se kontroluje, zda je v tagu slovicko ESCAPED a pomoci switche se pak data pripadne escapuji, ti chybi nekolikrat break; !
Priklad:

case 'HTML':
default: $return = "nl2br(htmlspecialchars($return))";

Pokud tedy v sablone pouziji napriklad <TMPL_VAR user ESCAPE="HTML"> dojde k tomu, ze se z bloku HTML skoci na dalsi blok, tudiz z HTML tagu budou entity a nedojde k zachovani HTML kodu ;-)

Jan Kahoun:

Omlouvam se, je to OK! Predtim jsem se do toho trosku zamotal :-)

Jan Kahoun:

Jeste se ale zeptam. Jak upravit vystup tak, aby nedochazelo k includovani prelozene sablony, ale aby se zkompilovana sablona, tedy jiz PHP skript, vykonala a vysledek se nasledne ulozil do nejake promene? jde mi o to, ze nekdy potrebuju provest jeste kus kodu, nez vypisu sablonu.
Diky za radu.

ikona Jakub Vrána OpenID:

Standardně pomocí output bufferingu.

Jan Kahoun:

Jen bych mel malou pripominku :-) Bylo by dobre, kdyby slo
u tagu TMPL_SELECT v atributu NAME zadat i toto: pole[]
Jako nejjednodusi reseni se nabizi pouziti rtrim :-)
Priklad:
} elseif ($tag == "TMPL_SELECT") {
  $_name = rtrim($name,"[]");

pak by se $_name pouzilo zde:

$return .= "<?phpnforeach ($vars["$_name\"] as \$key => \$val) {\n\techo '<option value=\"' . htmlspecialchars(\$key) . '\"' . (\$key == \$_REQUEST[\"$_name\"] ? ' selected=\"selected\"' : '') . '>' . htmlspecialchars(\$val) . '</option>';\n}\n?>";

PetrX:

Nevíte někdo jestli se na HTMLTmpl ještě stále pracuje? Poslední verze je z roku 2007 a já hledám vhodný a jednoduchý šablonovací systém, který bych chtěl používat. Musí však být i nadále vyvíjen abych se pak nedočkal doby kdy to přestane fungovat. Díky komukoliv za odpověď.

ikona Jakub Vrána OpenID:

Na HTMLTmpl se už nepracuje. Doporučit mohu CurlyBracketsFilter: http://nettephp.com/cs/template-filters#toc-filtr-curlybracketsfilter

ikona Zemistr:

Jestli můžu doporučit...já sem si oblíbil tenhle ;-)

http://templatepower.codocad.com/manual/index.php

ikona Zemistr:

mno a teď sem jen tak mrknul na bTemplate...to se mi taky dost zalíbilo :-)

http://www.massassi.com/bTemplate/index.php…&section=intro

Vložit příspěvek

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2016 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.