Přejít k navigační liště

Zdroják » PHP » Nette Framework: Chytré šablony

Nette Framework: Chytré šablony

Články PHP, Různé

Ačkoliv je PHP svým způsobem šablonovací jazyk, ve své čisté podobě se pro jejich kódování úplně nehodí. Proto vznikají nejrůznější šablonovací systémy. Nepřekvapí, že jeden takový je i součástí Nette Frameworku.

Šablonovací systém je dalším příkladem jednotky Nette Frameworku, kterou můžete ve svých aplikacích používat samostatně. Nejprve si povíme o motivaci, tedy proč vůbec šablonovací systém používat.

PHP a (ne)bezpečnost

Následující odstaveček si tvůrci PHP za rámeček nejspíš nedají. Jedním z nejtriviálnějších způsobů narušení webových stránek je Cross Site Scripting (XSS). Ať už z pohledu principu útoku nebo obrany proti němu. Přesto jde dost možná o nejčastější zranitelnost. Obranou je escapování, tj. převod znaků majících v daném kontextu speciální význam na jiné odpovídající sekvence.

Na webu se nejvíce setkáváme s pěti kontexty: HTML, JavaScript, URL, CSS a XML. Funkce escapující HTML by měla patřit k nejčastěji volaným funkcím PHP, proto ji autoři dali krátké a už od pohledu srozumitelné jméno htmlspecialchars. (Ano, dopustil jsem se ironie.) Aby fungovala univerzálně, musí se volat ještě s druhým parametrem, tj.  htmlspecialchars($s, ENT_QUOTES).

Escapovací funkce pro JavaScript se v PHP objevila až na sklonku roku 2006 pod zavádějícím názvem json_encode, což svádí k úvahám, že escapování řetězců je jen její vedlejší efekt. Pro escapování v kontextu URL slouží rawurlencode a pro CSS nebo XML nenabízí PHP doposud nic. Aneb naprogramuj si sám.

Tato bezpečnostní mizérie společně s bariérou v podobě direktivy short_open_tag vede k tomu, že i primitivní šablona pro výpis prvků pole vypadá takto:

<ul>
<?php foreach ($items as $item): ?>
        <li><a href='<?php echo htmlspecialchars($item->href, ENT_QUOTES) ?>'><?php echo htmlspecialchars($item->name) ?></a></li>
<?php endforeach ?>
</ul> 

Pokusme se nyní implementovat reálný požadavek vyplývající z nedokonalosti stále hojně používaného prohlížeče IE6, konkrétně přiřadit prvnímu prvku CSS třídu first a poslednímu last. Aby to bylo použitelné pro obecný iterátor (např. nebufferovaný databázový dotaz), nelze volat count. Výsledkem je tento šíleně šílený kód:

<ul>
<?php
...inicializace pomocných proměnných...
...cyklus...
...hromada podmínek...
...nepřehledný mix PHP a HTML...
?>
</ul> 

Omlouvám se laskavému čtenáři, nenašel jsem v sobě sílu zadání naprogramovat. Zkuste si to schválně jako domácí cvičení. S výsledkem se pak můžete pochlubit v komentářích. A nezapomeňte algoritmus vyzkoušet i pro krajní stavy, jako je prázdné nebo jednopoložkové pole ( <li class="first last">...</li>).

Šablony a la Nette Framework

Nette Framework přichází s alternativní formou zápisu. Výpis prvků pole zjednoduší do této podoby:

<ul>
{foreach $items as $item}
        <li><a href='{$item->href}'>{$item->name}</a></li>
{/foreach}
</ul> 

Syntax vám může být povědomá, podobnou používá řada šablonovacích systémů, z těch nejznámějších například Smarty. Všimněte si důležité věci: proměnné se automaticky escapují. Pokud by proměnná obsahovala HTML kód a chtěli bychom ji vypsat bez jakékoliv transformace, stačí přidat vykřičník:  {!$item->name}.

Poprvé se tak setkáváme s principem „less code, more security“, kdy méně psaní vede k více zabezpečenému kódu. Chcete vypnout escapování? Pak přidejte vykřičník. Nebo naopak, pokud zapomenete vykřičník, nedopustíte se bezpečnostní chyby.

Syntaxe nabízí celou řadu dalších konstrukcí, jako jsou třeba podmínky:

{if $stock} Skladem {elseif $onWay} Na cestě {else} Není dostupné {/if} 

Dále cykly {for ...} ... {/for} nebo {while ...} ... {/while} a řadu užitečných maker, jako například:

{include 'paginator.phtml'} 

pro vkládání podšablony z jiného souboru nebo pomocník pro generování HTML atributů  {attr ...}.

Vraťme se k iteračnímu cyklu {foreach ...}. Uvnitř něj se automaticky inicializuje „magická“ proměnná $iterator, pomocí které můžeme zkoumat právě probíhající cyklus. Její API disponuje čítačem průchodů nebo metodami zjišťujícími, zda je aktuální průchod sudý, lichý, první nebo poslední. Váš domácí úkol, tedy označení prvního prvku CSS třídou first a posledního last, lze v Nette Frameworku napsat takto:

<ul>
{foreach $items as $item}
        <li{attr class('first', $iterator->first) class('last', $iterator->last)}><a href='{$item->href}'>{$item->name}</a></li>
{/foreach}
</ul> 

Stručné, přehledné, srozumitelné – jedním slovem kouzelné!

Další šikovnou vlastností je kontextově-sensitivní escapování. Mějme šablonu obsahující kód v HTML a JavaScriptu:

<p>{$movies}</p>

<script>alert({$movies});</script> 

Pokud bude proměnná $movies obsahovat řetězec 'Amarcord & 8 1/2', vygeneruje se následujíci výstup. Všimněte si, že uvnitř HTML se použije jiné escapování, než uvnitř JavaScriptu.

<p>Amarcord &amp; 8 1/2</p>

<script>alert("Amarcord & 8 1/2");</script> 

Pohled pod kapotu

Šablonovací jednotka je umístěna ve jmenném prostoru NetteTemplates, jehož jádrem je třída NetteTemplatesTemplate. Jak s ní zacházet nejlépe, ukáže příklad.

$template = new Template;
$template->setFile('template.phtml'); // specifikuje soubor se šablonou
$template->firstName = 'John'; // vložení parametru
$template->lastName = 'Doe';
$template->render(); // vykreslí šablonu 

Metoda render() vykoná PHP skript uložený v souboru template.phtml, přičemž parametry budou k dispozici v lokálních proměnných $firstName a $lastName. Navíc v proměnné $template bude samotný objekt šablony.

Filtry šablon

Zatím ale nelze použít výše uvedenou alternativní formu zápisu se složenými závorkami. Tu je třeba aktivovat skrze tzv. filtr. Jde o běžnou funkci, která na vstupu dostane text šablony a vrátí jej nějak upravený. Framework je už s několika filtry dodáván, z nichž nejzajímavajší je CurlyBracketsFilter přidávající podporu onu šikovnější syntax.

$template->registerFilter('NetteTemplatesCurlyBracketsFilter::invoke'); 

Filtr nahradí v šabloně sekvence {...} za odpovídající PHP kód. Po aplikaci všech zaregistrovaných filtrů získáme nativní PHP šablonu. Ta se uloží do cache, takže aplikace fitrů se provádí jen jednou. Cache se invaliduje automaticky při změně zdrojového souboru a je ukládána ve zvláštním formátu, který dovoluje soubory načítat konstrukcí  include.

Z uvedeného vyplývají dvě podstatné skutečnosti. Jednak je šablonovací systém extrémně výkonný a plně využívá opcode akcelerace a cache. A za druhé – šablony lze pohodlně ladit, krokovat, umisťovat do nich break pointy, logovat výjimky a podobně.

Ještě je nutné určit adresář, do kterého se budou soubory cache ukládat:

// pro dočasné soubory použijeme podadresář tmp (musí mít práva zápisu)
Environment::setVariable('tempDir', dirname(__FILE__) . '/tmp'); 

Helpery

Vedle filtrů je možné do šablon registrovat i tzv. helpery. Opět jde o libovolnou funkci transformující vstupní proměnnou do výstupní podoby. Helperům však není předkládán obsah celé šablony, nýbrž si je kodér volá sám podle potřeby. Příkladem můze být třeba helper pro zobrazení data v národním formátu.

/**
 * České formátování data.
 * @param  int  timestamp
 * @return string
 */
function czechDateHelper($value)
{
        return date('j. n. Y', $value);
}

$template->registerHelper('date', 'czechDateHelper');
// nyní lze helper volat jako $template->date(...) 

Filtr CurlyBracketsFilter podporuje volání helperů přes svislítko:

Timestamp ve zdrojové podobě: {$timestamp}
Timestamp zformátovaný helperem date: {$timestamp|date} 

Helpery je možné zřetězit, např. {$title |lower|capitalize}, lze jim také předávat parametry, např. {$title |truncate:30}. Syntaxe bude opět blízká uživatelům Smarty.

Propojení s presenterem

Jak bylo řečeno výše, šablonovací engine je použitelný samostatně, tedy nejen v aplikacích postavených na bázi Model-View-Presenter. Nicméně platí to i naopak – tj. presentery nemusí používat šablonovací systém Nette Frameworku, ale jakýkoliv jiný. Stačí, aby implementoval rozhraní NetteTemplatesITemplate nebo NetteTemplatesIFileTemplate. Takže lze napsat obálku například nad Smarty implementující uvedené rozhraní a poté přepsat metodu presenteru createTemplate() tak, aby vracela objekt vlastní šablony. Integrovaný šablonovací systém je natolik výkonný a flexibilní, že nahrazovat jej jiným obvykle není třeba.

Vraťme se k našemu Automatu na kávu (viz díly MVC & MVP, Refactoring). Dalším logickým krokem bude zaregistrování filtru CurlyBracketsFilter a přepsání šablon do nové srozumitelnější syntaxe. Samotnou registraci je vhodné provést v metodě beforeRender(), která spadá do životního cyklu presenteru:

class MachinePresenter extends Presenter
{
        ...

        public function beforeRender()
        {
            $this->template->registerFilter('NetteTemplatesCurlyBracketsFilter::invoke');
        }

        ... 

Upravená šablona Machine.defau­lt.phtml:

<div id="machine">
  <p id="display">{$display}</p>

  <a href="{link buy!}"><img id="button" src="images/button.png" alt="Kup kávu" /></a>
</div>

<ul id="coins">
  <li><a href="{link insert!, 1}"><img src="images/coin-1.png" alt="Vhoď 1 Kč" /></a></li>
  <li><a href="{link insert!, 2}"><img src="images/coin-2.png" alt="Vhoď 2 Kč" /></a></li>
  <li><a href="{link insert!, 5}"><img src="images/coin-5.png" alt="Vhoď 5 Kč" /></a></li>
  <li><a href="{link insert!, 10}"><img src="images/coin-10.png" alt="Vhoď 10 Kč" /></a></li>
</ul> 

Zde vidíte použití makra {link ...}, které nahrazuje původní <?php echo $presenter->link(...) ?>. Nový kód automatu si můžete opět stáhnout na konci článku.

Šablonovací logika

Šablony představují osvědčenou a mnohdy podstatnou součást vrsty view. Někdy to může svádět k dojmu, že šablona = view. Taková představa je však mylná a vede ke špatnému návrhu aplikací. Například snaze umístit do šablony celou zobrazovací logiku. Toho se vyvarujte – do šablony patří jen podmnožina zobrazovací logiky, šablonovací logika.

Co to v praxi znamená? Vždy zvažte, jestli je šablona srozumitelná z pozice kodéra. Příklad: chcete v šabloně zobrazit stav a vytížení serveru a případný problém signalizovat barvou. Špatným rešením je provést analýzu přímo v šabloně, správným řešením je tak učinit v presenteru, například v metodě renderDefault() a teprve závěry předat parametrem šabloně. Na šablonovací logice pak leží jen úkol zjištěný závěr odprezentovat.

Co se nevešlo?

O šablonách by bylo možné psát ještě dlouho, nestlihl jsem představit všechny vestavěné filtry a helpery nebo nový koncept dědění šablon. Článek by se stal neúměrně dlouhým, takže zájemce odkazuji na oficiální dokumentaci.

Příště se opět vrátíme k aplikaci Automat na kávu, kde je třeba dohnat několik restů. Jako bonus se dozvíte, jak dát navždy sbohem konstrukci require_once a zase o něco zjednodušit nelehký život webového vývojáře.

Zdrojový kód ukázek je k dispozici ke stažení.

Autor článku je vývojář na volné noze, specializuje se na návrh a programování moderních webových aplikací. Pravidelně pořádá školení pro tvůrce webových aplikací, vyvíjí open-source knihovny Texy, dibi a Nette Framework.

Používáte šablonovací systém?

Komentáře

Subscribe
Upozornit na
guest
48 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
Mastodont

… Pokud by proměnná obsahovala HTML kód a chtěli bychom ji vypsat bez jakékoliv trasformace, stačí přidat vykřičník: {!$item->name}. …

Tipnul bych si, že většina programátorů si pod tímto zápisem představí úplně něco jiného než vypnuté escapování. A to je IMHO největší problém u D.G. – on naprosto kašle na logiku syntaxe, viz Texy, která je totálním galymatyášem nejrůznějších typů závorek apod.

Co třeba noescape($item->name) .. nebo filtr @@$item->name | noescape@ ..

v6ak

Toto je dost sporná věc. Už proto, že kdo používá CBF, ten bude většinou chtít vypisovat obsah proměnných a ne negovat boolean a vypisovat v surovém stavu (bez převodu na ano/ne apod.).
Ale je pravda, třeba taková dvojtečka (to mě tak letmo napadlo) by byla asi lepší.

RuDa

Já zase docela chápu, proč je tam ten vykřičník. Když udělám šablonu pro šéfa, který si ji třeba později chce upravit k obrazu svému, tak on pochopitelně nic neví o nějaké negaci, pro něj vykřičník znamená "pozor, (potenciálně) nebezpečná akce" (a přesně to jsem mu také řekl).
Tzn. v (pod)šabloně může přesouvat, přidávat nebo ubírat vyjmenované parametry (např. {$zbozi->popis} ), jejichž seznam dostal, ale případné vykřičníky musí napřed konzultovat. :-)

Ped

Ja myslim ze idealni sablony nemaji mit s programovanim nic spolecneho (proc, kdyz jde jenom o formu zobrazeni?). Takze ten vykricnik mi v tomhle kontextu nevadi, spis mi vadi ze jako linemu programatorovi se mi nechce ucit dalsi "jazyk" sablon, co znamena ze idealni sablony by meli mit i minimalni syntax (ktera samozrejme umoznuje maximum moznosti).

Z tohohle letmeho pohledu na sablony Netty to vypada ze se k tomu idealu blizi alespon tak jako jine sablonovaci systemy, i kdyz neni nad zkusenosti z velkeho projektu, tam se teprv ukaze.

Co by mne osobne zajimalo mnohem vic je reseni podpory prekladu, jak by se pan tvurce Netty vyporadal s touhle ulohou tak aby to bylo pokud mozno efektivni na vsech urovnich, t.j. zatez serveru, srozumitelnost kodu a moznost nechat prekladat stranky lidi kteri o programovani nic nevi a veci jako escapovani & nebo jmena promennych jim nic nerikaji. (ze je naucim neprekladat jmena promennych, s tim se pocita, ale vysvetlovat jim kompletni zaludnosti syntaxe ruznych specialnich znaku nelze, takze idealni system prekladu tyhle veci pred nimi ukryje natolik, aby nemohli nic pokazit)

Osobne si myslim ze sablony jsou jakymsi prvym krokem k tomuhle idealu, ale zajimalo by mne jak by resil konkretni implementaci takoveho systemu, kdy si uzivatel nastavi ve svem profilu svuj jazyk a pak se mu web zobrazuje ve zvolenem jazyce.

romansklenar

Podpora pro překlady je v Nette taky, volá se zápisem: {_'text to translate'} či {!_'text to translate'}. Co dělá vykřičník, to už asi uhádnete ;)

Nette ale nikomu nenutí používát nějaké konkrétní translatory/adaptéry, vyžaduje jen, aby implementoval rozhraní ITranslator, takže se dost dobře dá použít i ten ze Zendu, příklady implementace se dají nalést ve fóru. Podpora pro překlady je i ve formulářích, které jsou zmíněny některém z předchozím dílu seriálu.

KLoK

No to je prave dost vyhoda, protoze pro tvorbu sablon nepotrebujete programatora a staci Vam clovek se znalosti html a jednoducheho sablonovaciho jazyka. Pokud muzete plytvat programatorskym potencialem na tvorbu sablon, tak si toho luxusu uzivejte.

Navic velka cast programatoru je schopna delat ve vice jazycich a tohle jim urcite problem cinit nebude

A zaverem: neni problem vzit sablonovaci system pana Grudla a prepsat si jeho "CurlyBracketsFilter" na "DoubleAtFilterWithEscapeCalledByFunctionFilter"

Jarda

Ale vůbec ne, ta syntaxe je IMHO vynikající a naprosto snadno přejde do krve.
Mě osobně přijde podstatně hezčí a lepší než například syntaxe Smarty. Navíc se
dá CurlyBracketsFilter velice snadno rozšířit o další makra a filtry. Opravdu nevím, proč bych měl psát noescape($item->name) .. nebo filtr @@$item->name | noescape@ – to je úplně psycho :)

v6ak

Ještě dodám, že noescape mi přijde jako nejhorší zde zmíněné řešení – vypadá to jako volání funkce, což není možné zde použít.

Jarda

No a co se týče Texy a údajného galimatiáše – svou matku jsem naučil psát Texy (potažmo tedy validní html/xhtml) během 10 minut (narozdíl od wordu nebo Wysivyg editorů) – a ta opravdu není kodér ni programátor :)

Mastodont

Super, matka jako universální argument :-)))) Tak se zkuste zamyslet, proč se světě rozšířily různé varianty BBCode namísto třeba Markdown – jestli to náhodou nebude tím, že mají jednoduchou a hlavně konsistentní syntaxi.

Jarda

Máma řikala, že BBCode stojí za prd. :-)

Ne, ale vážně, každý co potřebuje, ale mě přijde Texy syntaxe šitá
na míru BFU (a mě taky). Zase tolik pravidel tam není, ne? :)

Anonymní

Jiste, mne se taky pise mnohem lip v ruznych wiki syntaxich, uz jen proto, ze onen Word skoro neovladam …

Nicmene je fakt, ze Texy syntaxe je podle me docela zverstvo :/

kulda

Naopak, Texy syntaxe je velmi elegantní. Sám jsem si dělal před pár lety vlastní wiki a vymýšlel vlastní syntaxy, aby byla co možná nejjednodušší… a když jsem pak viděl syntaxi Texy, byla mnohem jednodušší a intuitivnější něž ta moje.

yossarian

Ano, aneb nechme program delat neco, co neni explicitne receno, a nedelat to jedine pokud si rekneme. Cesta do pekla^2, neb clovek co pouziva toto v ramci 'zachovani bezpecnosti' bude vedet jeste vetsi lautrhovno o tom, proc je escapovani dulezite a k cemu se zrovna tady pouziva. Fuj.

KLoK

A proto ze nekdo nevi k cemu to escapovani je, tak bude lepsi mit nezabezpecenou aplikaci. A neni to cesta do pekel^3?

yossarian

A ted mi ukazte cloveka, ktery o moznych XSS exploitech nevi, a pritom vi co znamena escapovana promenna.

Porad si myslim, ze by kod mel delat to co po nem chce programator, a ne delat to, co si mysli, ze by se programatorovi mohlo hodit, potom vznikaji bastly jako Sharepoint od M$.

Pane Grudl, je pekne ze se snazite zvysit bezpecnost, ale pouze lepite zaplaty na rany aby nebyly videt, misto reseni samotne priciny. (coz priznavam, nebude asi uplne jednoduche, jestli vubec mozne.)

Jarda

>Porad si myslim, ze by kod mel delat to co po nem chce programator, a ne delat to, co si mysli, ze by se programatorovi mohlo hodit, potom vznikaji bastly jako Sharepoint od M$.

A to se tady neděje? Když chci používat šablony, tak je používám ne? Kdyz použiji {$var} tak právě proto, že vím, že $var bude escapovaná a právě proto jsem to použil.
Nechce se mi psát echo htmlspecialchars($var). Opravdu nějak Váš příspěvěk nechápu.

Borelioza

> Porad si myslim, ze by kod mel delat to co po nem chce programator

A odkud prosím berete přesvědčení, že programátor NECHCE, aby se to automaticky escapovalo? To je nějaký axiom nebo dogma…?

Jarda

> Pane Grudl, je pekne ze se snazite zvysit bezpecnost, ale pouze lepite zaplaty na rany aby nebyly videt, misto reseni samotne priciny. (coz priznavam, nebude asi uplne jednoduche, jestli vubec mozne.)

No a tohle je úplně směšné! Co že nám to tu vlastně sdělujete? Že je pan Grudl lepič záplat? Že je mnohem lepší řešit příčinu? Ale že to možná nejde? A máte pro nás ještě nějaký názor?

v6ak

Pokusím se rekonstruovat ideu:
1. programátor/kodér potřebuje proměnný text na základě vnějšího vstupu.
2. Často je potřeba to nějakým způsobem escapovat.
3. Obě varianty by si zasloužily trošku zkrátit.

Jako logické řešení se nabízí tedy k oboum variantám nabídnout kratší varianty a to tak, že se obě budou zapisovat jinak. Sedí?
Další věcí je, že si o to programátor musí říct sám pomocí CBF, protože nikde není psáno, že to musí chtít vždy.
Tak co, pokud jsem z toho vynechal syntaxi, vidí na tom někdo něco špatného?

Jakub Vrána

Escapování závislé na kontextu je chytré (a v Nette elegantně implementované), opsal to dokonce už i Google :-).

Pro úplnost bych dodal, že automatické escapování funguje jen v kontextu HTML textu, HTML atributu uzavřeného do uvozovek nebo apostrofů, CSS ve značce <style> a JavaScriptu ve značce <script>. Pokud by nějakého blouda napadlo uživatelský vstup použít třeba na místě názvu HTML značky, tak to fungovat nebude, stejně tak nebude fungovat JS a CSS ošetřování uvnitř atributů style a on* (to už by smysl dávat mohlo, ale lepší je to vyčlenit mimo HTML kód).

Jakub Vrána

Ještě jsem to trochu upravil. Jednak to nebylo HTML kompatibilní kvůli case-sensitivitě atributů a jednak se to nechalo chytit na známý chyták <p title=">">, kde > uvnitř ohraničené hodnoty atributu neukončuje značku.

danaketh

Já si myslím, že pokud to situace/rozpočet dovoluje, tak by šablony měl dělat někdo jiný ale ne programátor. Ten by se měl soustředit na aplikaci jako takovou a kodérovi šablon pak jen předat seznam proměnných nebo se s ním předem dohodnout co mu bude posílat.

Kodér přece nepotřebuje vědět o nějakém XSS, escapování a bůhví o čem ještě. Potřebuje znát HTML a syntaxi Nette šablon… Pak mu stačí říct, že když přidá před proměnnou !, vypíše se mu čisté HTML. Osobně považuji XSS, stejně jako SQL Injection a další možné útoky, za záležitost aplikace a programátora. Šablona je pouze výpis dat, sama o sobě už nemá nic ošetřovat, jen vypsat co dostane. Ošetřit to má aplikace.

Nette data implicitně ošetřuje a je to tak správně. Představte si, že předáte šablony někomu jinému a on by tam místo {!$var} našel nějakou šílenost… Zabije vás :) Takhle mu stačí říct, že ! vypíná escapování, případně mu ukázat co tím je myšleno. Hotovo, tečka.

Šablony jsou přece k výpisu dat, ne k dalšímu programování…!

Ikdyby David nakrásně vymýšlel zcela nová pravidla programování, převracel PHP vzhůru nohama a tvrdil, že nejlepší webovky uděláte Assemblerem, tak je to jeho věc. Nikdo vás Nette používat nenutí.

BTW: Nedávno jsem se ucházel o práci v jisté firmě a mezi požadavky byla znalost Nette frameworku. Takže buď tam zaměstnávají tupce nebo Nette opravdu má něco do sebe ;)

Kdyby se každý držel zaběhlých postupů tak urputně jak to tu někteří předvádějí, tak ještě dneska sedíme v jeskyni a šutrem škrábeme obrázky na její stěnu :))

Martin Hassman

Nedávno jsem se ucházel o práci v jisté firmě a mezi požadavky byla znalost Nette frameworku.

A bude hůř, to je jen začínající trend (nemyslím konkrétně jen Nette, ale obecně frameworky nebo pomocné nástroje).

danaketh

Ani mi to moc nevadí. Stejně už pár měsíců zkouším CodeIgniter a Cake, tak k tomu připojím i Nette. S frameworkem je práce většinou rychlejší a člověka práce víc baví, když se může soustředit jen na psaní specifických částí.

v6ak

Ten, kdo dělá šablony by IMHO měl znát XSS.
1. Pokud zná HTML, nemělo by to pro něj být problém.
2. Na XSS je řada možností, vč. url.
3. Srovnání s SQL Injection nesedí – SQL se typicky používá v modelu, zatímco HTML, JS, CSS (…) v šabloně/statické. To je asi hlavní odlišnost.

Anonymní

Framework nevypada spatne, i kdyz si myslim, ze autor mel nejdrive nastudovat Martina Fowlera a detailne se obeznamit treba s Ruby on Rails (ktere, a to je treba uznat, za velky peniz (utraceny za drahy hardware) nabizeji pro vyvojare hodne muziky, a tak nejak celkove udavaji smer ve vyvoji webovych frameworku), nez zacal vymyslet MVC framework v PHPku. Ne kvuli kopirovani, ale kvuli pochopeni zakladnich konceptu a inspiraci

Co me osobne ale nejde pod vousy je to, ze autor zjevne vyviji na Windowsech, a ne na Linuxu, jak by, pokud chce byt vniman jako skuteny guru, mel cinit:)

Ale ted vazne: Zajimaji autara takove veci, jako treba asynchronni procesy bezici na pozadi, navaznost na emailovy server, konfigurace Apache a MySQL a celkove zabezpeceni serveru, vyuziti cache (memcached) atd? Tedy veci, kvuli kterym vznikl LAMP, kteryzto akronym jiste netreba prekladat?

Nechci zbytecne rypat, ale fakt bych rad Nettte videl vyvijene na Linuxu, kam PHP prirozene patri. Tedy ne ze by neslo vyvijet na Windows, to jiste jde, ale prijde mi, ze linuxovi vyvojari jsou vetsinou skutecni odbornici, kdezto na Windowsech vyviji druha liga

Dost na tom, ze ze zdrojaku se stava hlasna trouba Microsoftu (viz hned DVA rozhovory o IE8 po sobe. To proboha nestaci jeden?), takze na nej, s vyjimkou skvelych clanku o Nette, na protest odmitam chodit

Anonymní

takovouto reakci jenom potvrzujete moje pochybnosti o Nette a vasi skutecne motivaci k jeho tvorbe, a pokud jsem nekdy uvazoval, ze bych take prispel k jeho vyvoji, tak ted uz neuvazuji

Anonymní

ne, 'atomické operace se soubory' se soubory me opravdu nedokazi presvedcit

misto nich davam prednost SQL a databazim :)

tomik.vitek

Děkujeme, že víme, že do Nette přispívat nebudete, a věřte, že jsem tomu opravdu všichni rádi…

Martin Hassman

s vyjimkou skvelych clanku o Nette, na protest odmitam chodit

V tom případě musím poděkovat za přízeň!

Anonymní

ze zacatku vypadal zdrojak velice nadejne, ale fakt to s tim microsoftem uz prehanite. Prece jenom plati, ze zdrojak patri pod root a ten je o open source

a prosim vas zkuste tomu Grudlovi vysvetlit, co je to feedback

Martin Hassman

zdrojak patri pod root a ten je o open source

Je mi líto, ale takhle takhle naše představa nevypadá. Jinak řečeno (ne)open source nebylo, není a nebude primárním kritériem pro výběr témat, která na Zdroják patří nebo nepatří. To nijak nevyjadřuje, zda open source v redakci máme nebo nemáme osobně rádi, ale to, jak by měl vypadat výběr témat pro magazín.

KLoK

Ten feedback, to je "Grudl je béčko protože si nepřečetl Fowlera a ještě vyvíjí na windowsech"? Nebo to je to s tou mrkví?

Anonymní

Rekl bych, ze bylo uz dost techhle reci o Microsoft dost, a IE8 fuj… Pokud si myslite, ze Microsoft neexistuje a jako takovy je potreba jej ignorovat, pak radeji vyhledejte pernikovou chaloupku.

Skvely serial o Nette mimochodem ;)

tomik.vitek

Tak já to zkusím: takže Davide, feedback, je takovýto, když se postavíš s mikrofonem moc blízko reprodukrů a začneš do toho mikrofonu foukat…

Jen tedy nevím, jakou to má souvislost…

Martin Hassman

Myslím, že jsme již zcela odbočili od tématu článku, proto celé toto vlákno mažu. Problematiku platformy Nette doporučuji řešit na fóru Nette, poznámky k zaměření magazínu pak přes redakční schránku. Tato diskuse nechť zůstane nadále otevřená pro téma články čili šablony v Nette.

Karel Hák

Dobrý den,

zkoušel jsem přetvořit router tak, aby vytvářel „hezká“ url, avšak
nepodařilo se mi to, proto bych se chtěl zeptat jak na to.

Změněný kód v bootstrap.php:
// Step 4: Setup application router
$application->setRouter(new SimpleRouter(‚Machi­ne:default‘));
$router = $application->getRouter();

// přidáme routu, objekt Route do MultiRouteru
$router[] = new Route(‚<presen­ter>/<action>/<co­in
[0–9]+>‘, array(
‚presenter‘ ⇒ ‚Machine‘,
‚action‘ ⇒ ‚default‘,
‚coin‘ ⇒ NULL,
));

Vygenerovaná url je však ve tvaru:
http:
test.local­host/machine/de­fault/5?do=in­sert

kamil

Líbí se mi že Grudly je podobný Smarty a navíc řešít třeba výpis v JS :)
good work

David Žaba

Dobry den. Krasny tutorial. Stahl a otestoval jsem aplikaci, avsak po nakupu napoje nad 10Kc se aplikace nepresmerovava na pohled COFFEE s nakoupenou kavou, tj. mince zustavaji stale zobrazeny a kava nikde. Netusite proc? Predesly dil bez pouziti adresare TEMP pro ukladanim docasnych souboru fungoval :-(

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.