Komentáře k článku
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.
Syntaxe
… 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@ ..
Re: Syntaxe
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ší.
Re: Syntaxe
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. :-)
Re: Syntaxe
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.
Re: Syntaxe
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.
Re: Syntaxe
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"
Re: Syntaxe
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 :)
Re: Syntaxe
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.
Re: Syntaxe
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 :)
Re: Syntaxe
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.
Re: Syntaxe
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? :)
Re: Syntaxe
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 :/
Re: Syntaxe
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.
RE: Nette Framework: Chytré šablony
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.
RE: Nette Framework: Chytré šablony
A proto ze nekdo nevi k cemu to escapovani je, tak bude lepsi mit nezabezpecenou aplikaci. A neni to cesta do pekel^3?
RE: Nette Framework: Chytré šablony
Samozřejmě to explicitně řečeno je. V dokumentaci, v tomto článku. {$xxx} vypíše escapovanou proměnnou. Lze to říct explicitněji?
RE: Nette Framework: Chytré šablony
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.)
RE: Nette Framework: Chytré šablony
>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.
RE: Nette Framework: Chytré šablony
> 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…?
RE: Nette Framework: Chytré šablony
> 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?
RE: Nette Framework: Chytré šablony
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é.
RE: Nette Framework: Chytré šablony
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?
Kontextově závislé escapování
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).Re: Kontextově závislé escapování
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 ;-)
Re: Kontextově závislé escapování
Byla to makačka ale je to tam ;)
Re: Kontextově závislé escapování
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.
Re: Kontextově závislé escapování
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?
RE: Nette Framework: Chytré šablony
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 :))
RE: Nette Framework: Chytré šablony
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).
RE: Nette Framework: Chytré šablony
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í.
Znalost XSS autorem šablon
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.
Vyvijeno na Windows == Nizsi duveryhodnost
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
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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 ;)
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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.
;)
Re: Vyvijeno na Windows == Nizsi duveryhodnost
ne, 'atomické operace se soubory' se soubory me opravdu nedokazi presvedcit
misto nich davam prednost SQL a databazim :)
Re: Vyvijeno na Windows == Nizsi duveryhodnost
Děkujeme, že víme, že do Nette přispívat nebudete, a věřte, že jsem tomu opravdu všichni rádi…
Re: Vyvijeno na Windows == Nizsi duveryhodnost
s vyjimkou skvelych clanku o Nette, na protest odmitam chodit
V tom případě musím poděkovat za přízeň!
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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.
Teď jsem se ztratil
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í?
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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 ;)
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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…
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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ů.
Re: Vyvijeno na Windows == Nizsi duveryhodnost
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.
Hezká URL v Coffe Machine
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
Šablonovací systém Grudly
Líbí se mi že Grudly je podobný Smarty a navíc řešít třeba výpis v JS :)
good work
Sablona COFFEE nefunkcni
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 :-(