Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

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.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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 Nette\Object, Nette\Web\Session 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 Nette\Object, Nette\Web\Session; 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 Nette\Framework;

// 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 Nette\Framework) 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 Nette\Forms\Form;

$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ď Nette\Debug::enable(), nebo přidejte Nette\Debug 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.

Anketa

Používáte Nette?

       

David Grudl

David Grudl

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

Školení Google+ pro firmy

DW - Školení PPC
  • Jak využít Google+ pro firemní komunikaci a marketing.
  • Čím se liší Google+ od Twitteru a Facebooku z pohledu firemního využití.
  • Jak využít Google+ v souladu s pravidly užívání.
  • Založení Google+ Page (Stránky) krok po kroku, včetně praktických tipů.

Detailní informace o školení Google+ »

Přehled názorů

Super
Zuse X4 10. 3. 2009 01:59
Nový
└ 
Re: Super
jar 10. 3. 2009 09:38
Nový
Revize použitá v seriálu
Patrik Votoček 10. 3. 2009 01:59
Nový
zaujimave :)
mirrec 10. 3. 2009 03:24
Nový
Sraz vývojářů webových aplikací
David Grudl 10. 3. 2009 05:38
Nový
MVC snizuje rychlost PHP aplikaci
karlik 10. 3. 2009 09:09
Nový
├ 
Re: MVC snizuje rychlost PHP aplikaci
Hoween 10. 3. 2009 09:21
Nový
├ 
Re: MVC snizuje rychlost PHP aplikaci
anonymní uživatel 10. 3. 2009 09:27
Nový
│
└ 
Re: MVC snizuje rychlost PHP aplikaci
N 10. 3. 2009 12:40
Nový
├ 
Re: MVC snizuje rychlost PHP aplikaci
David Grudl 10. 3. 2009 09:54
Nový
│
├ 
Re: MVC snizuje rychlost PHP aplikaci
anonymní uživatel 10. 3. 2009 10:55
Nový
│
│
└ 
Re: MVC snizuje rychlost PHP aplikaci
David Majda 10. 3. 2009 10:55
Nový
│
├ 
Re: MVC snizuje rychlost PHP aplikaci
anonymní uživatel 10. 3. 2009 10:59
Nový
│
└ 
Re: MVC snizuje rychlost PHP aplikaci
alblaho 10. 3. 2009 12:36
Nový
└ 
Re: MVC snizuje rychlost PHP aplikaci
webdev 10. 3. 2009 23:58
Nový
Ovce táhnou za Grudlem
Martin Soukup 10. 3. 2009 09:23
Nový
├ 
Re: Ovce táhnou za Grudlem
Hoween 10. 3. 2009 09:29
Nový
│
└ 
Re: Ovce táhnou za Grudlem
David Grudl 10. 3. 2009 10:11
Nový
│
 
└ 
Re: Ovce táhnou za Grudlem
Michal Krause 10. 3. 2009 10:22
Nový
├ 
Re: Ovce táhnou za Grudlem
romansklenar 10. 3. 2009 09:50
Nový
│
└ 
Re: Ovce táhnou za Grudlem
anonymní uživatel 10. 3. 2009 11:02
Nový
│
 
├ 
Re: Ovce táhnou za Grudlem
Ondřej Mirtes 10. 3. 2009 13:13
Nový
│
 
│
└ 
Re: Ovce táhnou za Grudlem
anonymní uživatel 10. 3. 2009 13:24
Nový
│
 
│
 
├ 
Re: Ovce táhnou za Grudlem
Ondřej Mirtes 10. 3. 2009 13:30
Nový
│
 
│
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
David Grudl 10. 3. 2009 13:45
Nový
│
 
│
 
 
├ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Martin Soukup 10. 3. 2009 14:27
Nový
│
 
│
 
 
│
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Tomáš Jukin 10. 3. 2009 14:41
Nový
│
 
│
 
 
│
 
├ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Hoween 10. 3. 2009 14:48
Nový
│
 
│
 
 
│
 
│
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Tomáš Jukin 10. 3. 2009 15:19
Nový
│
 
│
 
 
│
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
anonymní uživatel 10. 3. 2009 20:53
Nový
│
 
│
 
 
│
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
David Grudl 10. 3. 2009 21:09
Nový
│
 
│
 
 
│
 
 
 
├ 
Re: Ovce táhnou za Grudlem
Tomáš Vítek 10. 3. 2009 21:36
Nový
│
 
│
 
 
│
 
 
 
├ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
Martin Soukup 10. 3. 2009 21:38
Nový
│
 
│
 
 
│
 
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
anonymní uživatel 11. 3. 2009 01:09
Nový
│
 
│
 
 
│
 
 
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
David Grudl 11. 3. 2009 02:33
Nový
│
 
│
 
 
│
 
 
 
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
anonymní uživatel 11. 3. 2009 03:33
Nový
│
 
│
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
anonymní uživatel 10. 3. 2009 18:27
Nový
│
 
│
 
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
tiso 10. 3. 2009 23:57
Nový
│
 
│
 
 
 
 
└ 
Re: Ovce táhnou za GrudlemRe: Ovce táhnou za Grudlem
anonymní uživatel 11. 3. 2009 09:40
Nový
│
 
└ 
Re: Ovce táhnou za Grudlem
romansklenar 10. 3. 2009 13:27
Nový
├ 
Re: Ovce táhnou za Grudlem
karmi 10. 3. 2009 10:45
Nový
└ 
Re: Ovce táhnou za Grudlem
danaketh 10. 3. 2009 13:36
Nový
 
├ 
Re: Ovce táhnou za Grudlem
Martin Soukup 10. 3. 2009 14:30
Nový
 
│
├ 
Re: Ovce táhnou za Grudlem
danaketh 10. 3. 2009 14:49
Nový
 
│
├ 
Re: Ovce táhnou za Grudlem
Martin Štěpař 10. 3. 2009 15:09
Nový
 
│
│
└ 
Re: Ovce táhnou za Grudlem
romansklenar 10. 3. 2009 16:12
Nový
 
│
└ 
Re: Ovce táhnou za Grudlem
Ondřej Mirtes 10. 3. 2009 15:25
Nový
 
│
 
└ 
Re: Ovce táhnou za Grudlem
Hoween 10. 3. 2009 16:31
Nový
 
└ 
Re: Ovce táhnou za Grudlem
danaketh 10. 3. 2009 15:15
Nový
Zvyšte svoji produktivitu...
John 10. 3. 2009 09:32
Nový
Tohle že chcete psát v PHP
Vaclav Balak 10. 3. 2009 09:57
Nový
└ 
Re: Tohle že chcete psát v PHP
Lukino 10. 3. 2009 11:10
Nový
 
├ 
Re: Tohle že chcete psát v PHP
Hoween 10. 3. 2009 11:17
Nový
 
├ 
Re: Tohle že chcete psát v PHP
Vaclav Balak 10. 3. 2009 11:32
Nový
 
└ 
Re: Tohle že chcete psát v PHP
registrovaný uživatel 10. 3. 2009 13:14
Nový
 
 
├ 
Re: Tohle že chcete psát v PHP
Vaclav Balak 10. 3. 2009 13:41
Nový
 
 
├ 
Re: Tohle že chcete psát v PHP
Lukino 10. 3. 2009 15:17
Nový
 
 
└ 
Re: Tohle že chcete psát v PHP
Ferda 10. 3. 2009 16:14
Nový
 
 
 
└ 
Re: Tohle že chcete psát v PHP
Architekt 10. 3. 2009 18:09
Nový
 
 
 
 
├ 
Re: Tohle že chcete psát v PHP
webdev 11. 3. 2009 00:14
Nový
 
 
 
 
└ 
Re: Tohle že chcete psát v PHP
Observer 24. 4. 2011 17:15
Nový
cakephp
Andrej Kvasnica 10. 3. 2009 12:17
Nový
parada
YangombiUmpakati 10. 3. 2009 13:45
Nový
RE: Nette Framework: zvyšte svoji produktivitu
eclipse_guru 10. 3. 2009 15:00
Nový
└ 
RE: Nette Framework: zvyšte svoji produktivitu
Aleš Roubíček 10. 3. 2009 16:18
Nový
Grudl a ovce
ja 10. 3. 2009 17:45
Nový
pěkná práce
anonymní uživatel 10. 3. 2009 20:34
Nový
└ 
Re: pěkná práce
anonymní uživatel 10. 3. 2009 20:50
Nový
Chyba ?
Gerlige 11. 3. 2009 09:38
Nový
├ 
Re: Chyba ?
Martin Hassman 11. 3. 2009 09:51
Nový
│
└ 
Re: Chyba ?
Gerlige 11. 3. 2009 10:10
Nový
└ 
Re: Chyba ?
Martin Petrů 11. 3. 2009 09:51
Nový
Malý MVC
Tomáš Peterka 12. 3. 2009 20:51
Nový
jiná chyba
neo 20. 3. 2009 21:35
Nový
└ 
Re: jiná chyba
David Grudl 24. 3. 2009 14:43
Nový
Prvy dojem.
Daniel Šintaj 9. 6. 2009 13:34
Nový
Fatal error: Class 'Framework' not found in D:\www\nette\index.p hp on line 4
Radecek 21. 10. 2010 21:35
Nový
└ 
Re: Fatal error: Class 'Framework' not found in D:\www\nette\index.p hp on line…
:) 4. 11. 2010 22:50
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem