Nette Framework: zvyšte svoji produktivitu

Jaké jsou možnosti PHP frameworku Nette? Proč se vyplatí používat Nette místo programování v samotném PHP? Dnešním článkem začíná obsáhlý seriál, který vás s frameworkem Nette podrobně seznámí. Pojďte si s námi zkusit vytvořit v Nette svůj první formulář a rychle poznáte jeho výhody sami.

Seriál: Začínáme s Nette Framework (17 dílů)

  1. Nette Framework: zvyšte svoji produktivitu 10.3.2009
  2. Nette Framework: Odvšivujeme 17.3.2009
  3. Nette Framework: MVC & MVP 24.3.2009
  4. Nette Framework: Refactoring 31.3.2009
  5. Nette Framework: Chytré šablony 7.4.2009
  6. Nette Framework: adresářová struktura aplikace 14.4.2009
  7. Nette Framework: AJAX 21.4.2009
  8. Nette Framework: AJAX (pokračování) 28.4.2009
  9. Nette Framework: AJAX (dokončení) 5.5.2009
  10. Nette Framework: Sessions 12.5.2009
  11. Nette Framework: Přihlašování uživatelů 19.5.2009
  12. Nette Framework: Ověřování oprávnění a role 26.5.2009
  13. Nette Framework: Neprůstřelné formuláře 2.6.2009
  14. Nette Framework: Neprůstřelné formuláře II 9.6.2009
  15. Nette Framework: Neprůstřelné formuláře III 16.6.2009
  16. Nette Framework: Cache 23.6.2009
  17. Nette Framework: Co se do seriálu nevešlo? 30.6.2009

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.

Disclaimer: Autor článku je hlavním vývojářem frameworku Nette.

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ář:

Jednoduchý 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ě klienta

Validace na straně serveru

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.

Odeslaný formulář

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:

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:

Výjimka v PHP

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

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.

Používáte Nette?

David Grudl školí, je autorem PHP knihoven Nette Framework, databázové vrstvy dibi a formátovače HTML kódu Texy!.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 84

Přehled komentářů

ZuseX4 Super
jar Re: Super
Vrtak-CZ Revize použitá v seriálu
mirrec zaujimave :)
David Grudl Sraz vývojářů webových aplikací
karlik MVC snizuje rychlost PHP aplikaci
Hoween Re: MVC snizuje rychlost PHP aplikaci
Anonymní Re: MVC snizuje rychlost PHP aplikaci
N Re: MVC snizuje rychlost PHP aplikaci
David Grudl Re: MVC snizuje rychlost PHP aplikaci
Anonymní Re: MVC snizuje rychlost PHP aplikaci
David Majda Re: MVC snizuje rychlost PHP aplikaci
Anonymní Re: MVC snizuje rychlost PHP aplikaci
alblaho Re: MVC snizuje rychlost PHP aplikaci
webdev Re: MVC snizuje rychlost PHP aplikaci
Martin Soukup Ovce táhnou za Grudlem
Hoween Re: Ovce táhnou za Grudlem
David Grudl Re: Ovce táhnou za Grudlem
mike Re: Ovce táhnou za Grudlem
romansklenar Re: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za Grudlem
Ondřej Mirtes Re: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za Grudlem
Ondřej Mirtes Re: Ovce táhnou za Grudlem
David Grudl Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Martin Soukup Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Tomáš Jukin Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Hoween Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Tomáš Jukin Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
David Grudl Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
tomik.vitek Re: Ovce táhnou za Grudlem
Martin Soukup Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
David Grudl Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
tiso Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Anonymní Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
romansklenar Re: Ovce táhnou za Grudlem
karmi Re: Ovce táhnou za Grudlem
danaketh Re: Ovce táhnou za Grudlem
Martin Soukup Re: Ovce táhnou za Grudlem
danaketh Re: Ovce táhnou za Grudlem
Martin Štěpař Re: Ovce táhnou za Grudlem
romansklenar Re: Ovce táhnou za Grudlem
Ondřej Mirtes Re: Ovce táhnou za Grudlem
Hoween Re: Ovce táhnou za Grudlem
danaketh Re: Ovce táhnou za Grudlem
John Zvyšte svoji produktivitu...
shMoula Tohle že chcete psát v PHP
Lukino Re: Tohle že chcete psát v PHP
Hoween Re: Tohle že chcete psát v PHP
shMoula Re: Tohle že chcete psát v PHP
registrovaný uživatel Re: Tohle že chcete psát v PHP
shMoula Re: Tohle že chcete psát v PHP
Lukino Re: Tohle že chcete psát v PHP
Ferda Re: Tohle že chcete psát v PHP
Architekt Re: Tohle že chcete psát v PHP
webdev Re: Tohle že chcete psát v PHP
Observer Re: Tohle že chcete psát v PHP
andrejk cakephp
YangombiUmpakati parada
eclipse_guru RE: Nette Framework: zvyšte svoji produktivitu
Aleš Roubíček RE: Nette Framework: zvyšte svoji produktivitu
ja Grudl a ovce
Anonymní pěkná práce
Anonymní Re: pěkná práce
Gerlige Chyba ?
Martin Hassman Re: Chyba ?
Gerlige Re: Chyba ?
Martin Petrů Re: Chyba ?
atheiste Malý MVC
neo jiná chyba
David Grudl Re: jiná chyba
Daan Prvy dojem.
Radecek Fatal error: Class 'Framework' not found in D:wwwnetteindex.php on line 4
:) Re: Fatal error: Class 'Framework' not found in D:wwwnetteindex.php on line 4
David Otázka začátečníka
?
?
? Příklad s Form
? Příklad s Form - doplnění
Karel nefunkční
Zdroj: https://www.zdrojak.cz/?p=2945