Opravdoví programátoři nepoužívají frameworky. Píší webové aplikace přes telnet rovnou na server a to zpaměti. Tímto jim vzdávám hold a dál už se bude seriál věnovat pouze frameworkům.
Frameworky jsou knihovny, které mají ulehčit práci při programování aplikace. To znamená méně psaní, přehlednější kód a rychlejší vývoj. V případě webových frameworků se často zmiňuje MVC, což je architektura rozdělující aplikaci na nezávislé vrstvy. O té si povíme více ve třetím dílu.
Pokud tvoříte webové aplikace a už vás nebaví řešit neustále se opakující úkoly, ty tisíce drobností, které odvádějí pozornost od vlastní aplikace a dělají z programování nudnou činnost, tak je seriál o Nette Frameworku určen právě pro vás.
Co je Nette Framework?
Nette Framework je napsaný v PHP 5 s plným využitím objektů (OOP). Ačkoliv vznikl už v roce 2004, teprve vloni byl uvolněn jako open source a zpřístupněn veřejnosti. Jeho licence, která vychází z BSD, patří k těm nejvolnějším. Vyrostla kolem něj jedna z nejaktivnějších komunit českých PHP vývojářů, ne-li nejaktivnější vůbec. Nette používají významné tuzemské společnosti. A podle testu uveřejněném na serveru Root je jedním z nejvýkonnějších frameworků.
Framework je koncipován jako „otevřený“, je ho tedy možné používat i v primitivních webových aplikacích nebo společně s jiným otevřeným frameworkem, jako je například Zend Framework.
Primitivní aplikace?
Ano, myslím takový ten webíček pro místní restauraci, kde jsou dvě statické stránky a kontaktní formulář. Připadá vám, že na něco takového použít framework je jako jít na komára s plamenometem? A proč ne, je to účinné a zábavné! Obojí.
Složitější aplikace
Tedy všechny e-shopy, wiki, blogy a CMS. Teprve tady se ukáže síla frameworku v plné kráse. Umožní rychle přetavit myšlenku do kvalitní webové aplikace. Eliminuje bezpečnostní rizika. A vede vás k psaní programů s čistým designem a důrazem na budoucí rozšiřitelnost. To ostatně bude hlavní náplní našeho seriálu.
Enterprise aplikace
Tedy nejvyšší úroveň webových aplikací, například bankovní systémy. Tohle že chcete psát v PHP?
Volba distribuce
Pojďme tedy napsat první aplikaci za použití Nette Frameworku. Budu předpokládat, že máte nakonfigurovaný HTTP server. Postupů, jak na to, najdete na mateřském Rootu požehnaně. Přistupme rovnou ke stažení frameworku. Jak vidíte, k dispozici jsou tři verze. Poslední z nich je určená pro PHP 5.3 a využívá jmenných prostorů. Nacházejí se v ní třídy pojmenované jako NetteObject, NetteWebSession a podobně. Této verzi patří, stejně jako aluminiu, budoucnost.
Bohužel zatím je aktuální PHP ve verzi 5.2, které na jmenné prostory hledí jako tele na nová vrata a zmůže se maximálně na udivený parse error. Proto existuje verze, kde se prostory eliminují a třídy se nazývají jen Object, Session atd. Následný přechod na jmenné prostory bude snadný, stačí totiž doplnit do skriptů deklaraci use NetteObject, NetteWebSession; Stejnou techniku budu používat i v tomto seriálu. Ukázkové kódy budou psané pro PHP 5.2 a zároveň připravené pro PHP 5.3.
Pokud je pro vás důležitější zamezení případným kolizím v názvech tříd než budoucí přechod na PHP 5.3, bude se vám hodit verze označená jako „prefixed“. Zde mají všechny třídy předponu N, tj. NObject, NSession atd.
Vězte, že všechny verze jsou funkčně 100% ekvivalentní.
Stáhněte a rozbalte si tedy verzi pro PHP 5.2 (neprefixovanou) či PHP 5.3. A rovnou si napište první program:
// zde prosím uveďte skutečnou cestu ke složce Nette uvnitř distribuce
require 'Nette/loader.php';
// pokud používáte verzi pro PHP 5.3, odkomentujte následující řádek:
// use NetteFramework;
// vypíše číslo verze, v současnosti to je 0.8
echo Framework::VERSION;
S tímto programem sice žádnou programátorskou soutěž nevyhrajete, ale jako indikátor, jestli všechno běží, jak má, to stačí. Vidíte, jak je kód připraven na budoucí PHP 5.3, a především, jak se celý framework načítá. Stačí načíst jediný soubor loader.php. Všechny ostatní třídy (v tomto případě třída NetteFramework) se už načtou automaticky. Paráda, že?
Kompaktní verze
Nahrávat na server framework zvící pár desítek souborů může být otravné a problematické, protože internetová připojení mají tendenci vypadnout v nejméně vhodnou chvíli. Proto se v distribuci v adresáři Nette.compact nachází i jednosouborová verze, do které se celý framework zdrcnul. Ve většině případů by měla být kompaktní verze i rychlejší. Nicméně na vývojářském počítači budeme používat vždy verzi plnou.
Můj první formulář
Zmiňoval jsem se o primitivních webových aplikacích s jedním kontaktní formulářem. K čemu nasazovat framework na jeden formulář? Když si člověk představí, co všechno takový formulář obnáší:
- napsat rutinní HTML kód (ošetřil jsem chyby a odlišnosti prohlížečů?),
- napsat javascriptovou validaci,
- napsat serverovou validaci (takže totéž znovu, jen jiný jazyk, ach jo),
- v případě chyby vypsat formulář znovu s vyplněnými políčky (nezapomněl jsem někde použít htmlSpecialChars?),
- testovat kód, ověřit funkčnost v prohlížečích,
- ošetřil jsem magic quotes?
Celá řada relativně jednoduchých, avšak nezáživných úkolů. Svádí člověka na něco zapomenout (často případ magic quotes, viz třeba nový web České televize), nebo práci trošku ošidit (Javascriptová validace? Nemám čas. Serverová validace? Dopíšu hned zítra). Dobrá, pomoc by se tu nejspíš hodila, tak se předveď, frameworku. A nahrát na server jeden soubor navíc nebolí.
Zkuste si napsat tento prográmek. Upozornění: skript musí být uložen v UTF-8.
require 'Nette/loader.php';
// pokud používáte verzi pro PHP 5.3, odkomentujte následující řádek:
// use NetteFormsForm;
$form = new Form;
$form->addText('name', 'Jméno:'); // name je název prvku, Jméno: je popisek
$form->addText('email', 'E-mail:');
$form->addCheckbox('promo', 'zasílejte mi reklamu');
$form->addTextArea('text', 'Vzkaz:');
$form->addSubmit('send', 'Odeslat');
echo $form;
Vykreslí se nám následující formulář:

Při kliknutí na popisky se kurzor automaticky objeví ve formulářovém políčku. Hezké, ale chtělo by to oživit. Přidat validační pravidla, zjistit, jestli byl formulář odeslán a pak hodnoty uložit do databáze.
Jedno po druhém. Validační pravidla přidáme metodou addRule(), jejíž parametry jsou typ pravidla a chybová hláška, která se zobrazí, pokud hodnota validací neprojde. Můžeme si vytvářet vlastní validační pravidla, zatím si vystačíme s předdefinovanými.
Definici formuláře upravíme do této podoby:
$form = new Form;
$form->addText('name', 'Jméno:')
->addRule(Form::FILLED, 'Zadejte prosím své jméno');
$form->addText('email', 'E-mail:')
->addRule(Form::EMAIL, 'Zadejte prosím platnou e-mailovou adresu');
$form->addCheckbox('promo', 'zasílejte mi reklamu');
$form->addTextArea('text', 'Vzkaz:')
->addRule(Form::FILLED, 'Napište nám prosím vzkaz');
$form->addSubmit('send', 'Odeslat');
Zbývá dopsat životní cyklus formuláře. Pokud je formulář odeslán (form is submitted) a je validní (is valid), data zpracujeme. Zatím jen tak, že je vypíšeme do okna prohlížeče. K tomu využijeme metodu Debug::dump(), která pole hezky v HTML naformátuje A pokud formulář odeslán není, nastavíme mu vychozí hodnoty.
Za definici formuláře tedy vložte kód:
// jestliže byl formulář odeslán
if ($form->isSubmitted()) {
// a jestliže jsou všechny položky vyplněny správně
if ($form->isValid()) {
echo '<h1>Formulář byl odeslán</h1>';
$values = $form->getValues();
Debug::dump($values);
exit;
}
} else {
// a jestliže nebyl odeslán, nastavíme výchozí hodnoty
$form->setDefaults(array(
'promo' => TRUE, // každý si přeje, abychom mu zaplevelili e-mailovou schránku
));
}
echo $form;
Tímto máme hotový plně funkční formulář, který disponuje validací na straně klienta (tj. javascriptová validace) i validací na straně serveru.

Validace na straně klienta

Validace na straně serveru
Formulář se bude uživateli vykreslovat tak dlouho, dokud ho nevyplní správně. Poté získáme pole hodnot, kde klíče tvoří názvy jednotlivých prvků. Přičemž z textových políček jsou automaticky odstraněny levostranné i pravostranné mezery, ošetří se magic quotes, ověří se, zda jde o validní UTF-8 řetězce. Na tyto věci už nemusíme nikdy myslet.

Mohli bychom přidat složitější validační pravidla (například chtít platný e-mail jen v případě, že je políčko zasílejte mi reklamu zatrhnuté), mohli bychom zcela změnit způsob, jak se formulář vykreslí, přidat vlastní formulářové prvky, ale tohle všechno si necháme na jedno z příštích pokračování. Dnes už jen nakousnu, čeho se bude týkat díl příští.
Odvšivování
Během vývoje aplikací v Nette Frameworku oceníte tři užitečné věci:
- aktivní fórum,
- API dokumentaci (verze pro prefixovanou distribuci),
- třídu NetteDebug, známou též jako Laděnka.
Co by se stalo, kdybych v uvedeném kódu, ach já nešika, místo $form->isSubmitted() napsal $form->isSubmited()? PHP by vyhodilo výjimku:
Pravda, všechny důležité informace tam jsou, ale kdo se v tom má vyznat? Pozveme si tedy Laděnku, ať nám chybu ukáže po svém. Stačí do kódu, nejlépe hned za volání require 'Nette/loader.php', přidat řádek
Debug::enable();
(pro uživatele PHP 5.3: zavolejte buď NetteDebug::enable(), nebo přidejte NetteDebug do klauzule use)
a najednou se výjimka zobrazí dočista v jiné podobě:
Laděnka si vzala slovo
To je ovšem jiné kafe, že? Chybová zpráva doslova křičí, vidíte část zdrojového kódu se zvýrazněným řádkem, kde k chybě došlo, informace Call to undefined method Form::isSubmited() srozumitelně vysvětluje, o jakou chybu jde. Celá stránka je navíc živá, můžete se proklikávat k větším podrobnostem. Zkuste si to.
Jak vidíte, Laděnka je poměrně výřečná, což lze ocenit ve vývojovém prostředí, zatímco na produkčním serveru by to způsobilo hotové neštěstí. Tam se totiž žádné ladící informace vypsat nesmí. Laděnka proto disponuje autodetekcí prostředí a pokud příklad spustíte na ostrém serveru, výsledkem bude prázdná obrazovka.
Příště se Laděnce podíváme pod sukni. Těšte se.
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.




Přehled komentářů