Nette Framework: Chytré šablony

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.
Seriál: Začínáme s Nette Framework (17 dílů)
- Nette Framework: zvyšte svoji produktivitu 10. 3. 2009
- Nette Framework: Odvšivujeme 17. 3. 2009
- Nette Framework: MVC & MVP 24. 3. 2009
- Nette Framework: Refactoring 31. 3. 2009
- Nette Framework: Chytré šablony 7. 4. 2009
- Nette Framework: adresářová struktura aplikace 14. 4. 2009
- Nette Framework: AJAX 21. 4. 2009
- Nette Framework: AJAX (pokračování) 28. 4. 2009
- Nette Framework: AJAX (dokončení) 5. 5. 2009
- Nette Framework: Sessions 12. 5. 2009
- Nette Framework: Přihlašování uživatelů 19. 5. 2009
- Nette Framework: Ověřování oprávnění a role 26. 5. 2009
- Nette Framework: Neprůstřelné formuláře 2. 6. 2009
- Nette Framework: Neprůstřelné formuláře II 9. 6. 2009
- Nette Framework: Neprůstřelné formuláře III 16. 6. 2009
- Nette Framework: Cache 23. 6. 2009
- Nette Framework: Co se do seriálu nevešlo? 30. 6. 2009
Š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 & 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.default.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.
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.
… 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@ ..
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ší.
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. :-)
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.
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.
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"
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 :)
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.
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 :)
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.
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? :)
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 :/
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.
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.
A proto ze nekdo nevi k cemu to escapovani je, tak bude lepsi mit nezabezpecenou aplikaci. A neni to cesta do pekel^3?
Samozřejmě to explicitně řečeno je. V dokumentaci, v tomto článku. {$xxx} vypíše escapovanou proměnnou. Lze to říct explicitněji?
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.)
>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.
> 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…?
> 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?
Nepochopil jste princip.
Je zbytečné se rozčilovat, zkuste si článek přečíst ještě jednou, nebo úplně nejlépe, vyzkoušet si to na svém počítači a rychle pochopíte, jak je řešení příjemné a užitečné.
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?
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
aon*
(to už by smysl dávat mohlo, ale lepší je to vyčlenit mimo HTML kód).To je dobrá poznámka a váhám, jestli podporu pro style="…" a on*="…" přidat. Asi přidám.
(S tím Googlem jsi mě dostal. Takže nejenom Microsoft kopíruje Nette ;-)
Byla to makačka ale je to tam ;)
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.
Díky, teď se může jít Google klouzat ;))
ps. Taky bych se šel klouzat. Kde se dá jít v tuhle roční dobu klouzat?
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 :))
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).
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í.
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.
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
Tohle raději přejdu…
To jsou dobré otázky. Obzvlášť, když vidím, jak špatně (nebo vůbec)
se tyto věci řeší v populárních open source aplikacích. Proto Nette SafeStream patří
k nejdříve uvolněným
částem frameworku. Dnes je už sice mimo mainstream frameworku, nahradila ji
cache, která však atomické operace se soubory zaručuje taky. Týká se to
i v tomto článku zmíněných šablon – nemůže se stát, že by se
obsah natáhl neúplný nebo jinak poškozený.
Cache (jako drtivá většina věcí ve frameworku) je založena na
interfaces, je tedy možné čistým způsobem přidat libovolný další
adaptér (nedá mi to – Ruby a Rails interfaces nemají, možná si měli
autoři nejdřív nastudovat Fowlera a Nette). Adaptér pro Memcached je
součástí distribuce.
Něco málo o zabezpečení serveru a konfiguraci viz druhý
díl a ten příští.
Ja bych vás zase rád viděl s lubrikovanou mrkví zaraženou *********, ale ne vždy se naše přání plní.
Díky za pochvalu ;)
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
Jsem rád, že vás atomické operace se soubory a podpora memcached přesvědčily o kvalitách frameworku. Motivací vývoje skutečně byla absence jiného frameworku, který by podobné věci v základu nabízel.
;)
ne, 'atomické operace se soubory' se soubory me opravdu nedokazi presvedcit
misto nich davam prednost SQL a databazim :)
Děkujeme, že víme, že do Nette přispívat nebudete, a věřte, že jsem tomu opravdu všichni rádi…
s vyjimkou skvelych clanku o Nette, na protest odmitam chodit
V tom případě musím poděkovat za přízeň!
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
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.
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í?
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 ;)
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…
Děkuji :-) Jen slovo "feedback" mě uvádí do nejistoty, kterou částí těla mám do toho mikrofonu foukat.
p.s. Není nutné reagovat na každou žádost od zamindrákovaných anonymů.
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.
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(‚Machine:default‘));
$router = $application->getRouter();
// přidáme routu, objekt Route do MultiRouteru
$router[] = new Route(‚<presenter>/<action>/<coin
[0–9]+>‘, array(
‚presenter‘ ⇒ ‚Machine‘,
‚action‘ ⇒ ‚default‘,
‚coin‘ ⇒ NULL,
));
Vygenerovaná url je však ve tvaru:
http:test.localhost/machine/default/5?do=insert
Líbí se mi že Grudly je podobný Smarty a navíc řešít třeba výpis v JS :)
good work
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 :-(