Přejít k navigační liště

Zdroják » PHP » Nette Framework: Co se do seriálu nevešlo?

Nette Framework: Co se do seriálu nevešlo?

Články PHP, Různé

V závěrečném předprázdninovém díle si ukážeme několik užitečných tříd, na které dosud nezbyl čas. Od rutin pro práci s řetězci, přes obrázky až po odesílání e-mailů.

Programátor webových aplikací musí často řešit drobné úkony, jejichž podpora na straně PHP je nedostatečná. Proto je tu Nette Framework, aby programátorům život zpříjemnil. Nicméně framework se nechce stát „molochem“, proto implementuje jen ty záležitosti, které jsou potřeba velmi často a kde může nabídnout výrazně vyšší komfort.

Chcete se naučit o Nette víc?

Akademie Root.cz školení Vývoj webových aplikací v Nette Framework. Kurz je určen všem programátorům v PHP, kteří se chtějí naučit tvořit webové aplikace rychle a kvalitně, bez bezpečnostních děr. Jako aplikační rámec slouží Nette Framework. Školí sám autor Nette – David Grudl. Máte zájem o jiné školení? Napište nám!

Obrázky

Základní manipulace s obrázky, jako je zmenšení, oříznutí nebo doostření, je příkladem úkolu, se kterým se programátoři potýkají velmi často. Přitom standardní funkce PHP nevedou k příliš čitelnému a srozumitelnému kódu. Nette Framework proto přichází s třídou NetteImage, která práci s obrázky zpříjemní.

Nejprve obrázek načteme ze souboru:

require 'Nette/loader.php';

// pokud používáte verzi pro PHP 5.3, odkomentujte následující řádek:
// use NetteImage;

$image = Image::fromFile('image.jpg'); 

Nebo vytvoříme prázdný obrázek:

$image = Image::fromBlank(100, 200); // 100 × 200 pixelů 

Vypíšeme rozměry obrázku:

echo "Rozměry $image->width x $image->height"; 

A proporcionálně ho zmenšíme, aby nepřesáhl rozměry avataru 48×48 pixelů:

$image->resize(48, 48);

// také je možné specifikovat jen jeden rozměr a druhý se dopočítá:
$image->resize(48, NULL);
// nebo
$image->resize(NULL, 48);

// či uvést rozměr v procentech:
$image->resize('75%', NULL); 

Metoda resize() obrázek jen zmenšuje – zvětšení si vynutíte příznakem Image::ENLARGE. Neproporcionální operace aktivuje příznak Image::STRETCH. Oba lze zkombinovat:

$image->resize(48, 48, Image::ENLARGE | Image::STRETCH); 

Nebo můžeme obrázek oříznout dle souřadnic obdélníku:

$image->crop($left, $top, $width, $height); 

Zmenšený obrázek můžeme vložit do jiného, jak ukazuje následující kód. Všimněte si, jak lze v metodě fromBlank() třetím parametrem určit barvu pozadí:

$blank = Image::fromBlank(320, 240, Image::rgb(52, 132, 210));
$blank->place($image,  0,  0); // vložíme na pozici 0px, 0px

// souřadnice lze uvést opět v procentech
$blank->place($image, '80%', '75%', 25); // a nastavit průhlednost, zde 25 % 

Vlastně můžete použít všechny funkce z rozšíření GD, například imagefilledrec­tangle, ale s využitím srozumitelnějšího objektového přístupu:

$image->filledRectangle( 0,  0, $size - 1, $size - 1, Image::rgb(255, 255, 255)); 

Nakonec obrázek uložíme do souboru:

$image->save('image.jpg'); 

či rovnou pošleme do prohlížeče (framework nastaví hlavičku  Content-Type):

$image->send(); // odešle jako JPEG
$image->send(Image::PNG); // odešle jako PNG 

Pokud váš hosting disponuje knihovnou ImageMagick (samotné PHP přitom žádné rozšíření nevyžaduje), Nette Framework ji automaticky využije při práci s velkými obrázky. Stačí jen nastavit:

Image::$useImageMagick = TRUE; 

A to je vše, dál používáte stejné příkazy, jako jsme používali v příkladech výše.

HTTP request & response

Nette Framework zapouzdřuje HTTP požadavek a HTTP odpověď do objektů třídy NetteWebHttpR­equest a NetteWebHttpR­esponse. Důležité je vědět, že nejde o obyčejnou objektovou slupku nad superglobálními poli $_GET, $_POST nebo $_COOKIE, ale především o sanitizační filtr, který odstraní případné magic_quotes a pročistí proměnné od kontrolních znaků a znaků neplatných v použitém kódování.

Pár příkladů použití:

// use NetteEnvironment;

$httpRequest = Environment::getHttpRequest();

// zkoumání aktuálního URI
echo $httpRequest->uri; // http://nettephp.com/cs/dokumentace?action=edit
echo $httpRequest->uri->host; // nettephp.com
echo $httpRequest->uri->path; // /cs/dokumentace

// je spojení šifrované (HTTPS)?
echo $httpRequest->isSecured();

// jde o AJAXový požadavek?
echo $httpRequest->isAjax(); 

Užitečná je také metoda detectLanguage(), které předáme pole s podporovanými jazyky aplikací a ona vrátí ten, který je podle nastavení prohlížeče uživatelem nejpreferovanější:

echo $httpRequest->detectLanguage(array('cs', 'en', 'de')); // např. cs 

Řetězce

Statická třída NetteString nabízí kolekci metod pro práci s řetězci. Mezi nejužitečnější patří asi webalize() a truncate(). První zmíněná překonvertuje řetězec do podoby, která se používá v URL adresách:

// use NetteString;
echo String::webalize("žluťoučký kůň na H1"); // zlutoucky-kun-na-h1 

Truncate zkrátí řetězec na zadanou maximální délku. Podstatné je, že zachová celá slova (tedy je-li to možné). A také na konec zkráceného textu přidá typografickou trojtečku:

echo String::truncate('Řekněte, jak se máte?', 5); // 'Řekn…'
echo String::truncate('Řekněte, jak se máte?', 20); // 'Řekněte, jak se…'
echo String::truncate('Řekněte, jak se máte?', 30); // 'Řekněte, jak se máte?' 

Html

Třída NetteWebHtml zapouzdřující HTML element by vám mohla být známa, protože byla zveřejněna o něco dříve než samotný framework.

// use NetteWebHtml;

echo Html::el('input')->type('checkbox')->checked(TRUE);
// <input type="checkbox" checked="checked" />

$el = Html::el('div');
$el->style['color'] = 'green';
$el->style['display'] = 'none';
echo $el;
// <div style="color:green;display:none"></div> 

Důležitým rysem je automatická ochrana proti XSS:

echo Html::el('input')->value('<script>alert()</script>');
// <input value="&lt;script&gt;alert()&lt;/script&gt;" /> 

A třešničkou na dortu klacík hozený pod nohy spamerům ;)

echo Html::el('a')->href('mailto:user@example.com')->setText('email');
// <a href="mailto:user@example.com">email</a> 

Stránkování

Stránkovací matematika je nesmírně zrádná. Jde v podstatě o jednoduchou trojčlenku, ale mezní hodnoty mohou nejednomu programátorovi zamotat hlavu. Rozmotat ji pomůže NettePaginator . Nastavíme pouhé tři hodnoty: celkový počet položek, počet položek na stránce a číslo aktuální stránky:

// use NettePaginator;
$paginator = new Paginator;
$paginator->setItemCount(356); // celkový počet položek (např. článků, komentářů)
$paginator->setItemsPerPage(30); // počet položek na stránce
$paginator->setPage(1); // číslo aktuální stránky; standardně se čísluje od 1 

Tento objekt si můžete vložit třeba do šablony a pak už se jen srozumitelně ptát:

if ($paginator->first) ... // jsme na první stránce?
if ($paginator->last) ... // jsme na poslední stránce?
echo $paginator->page; // číslo aktuální stránky 

Nebo jej použít při formulování SQL dotazu, kde konkrétně metody getLength() a getOffset() vrací hodnoty používané v klauzuli LIMIT a OFFSET.

Mail

Dnešní povídání bych završil novinkou, kterou najdete ve verzi 0.9. A tou jsou třídy pro posílání e-mailů, NetteMail .

// use NetteMailMail;

$mail = new Mail;
$mail->setFrom('Franta <franta@example.com>')
        ->addTo('petr@example.com')
        ->addTo('jirka@example.com')
        ->setSubject('Potvrzení objednávky')
        ->setBody("Dobrý den,nvaše objednávka byla přijata.") // HTML obsah nastavíme metodou setHtmlBody()
        ->send(); 

Do e-mailu lze samozřejmě vkládat i přílohy:

$mail->addAttachment('example.zip'); 

Skutečná síla se projeví při zkombinování se šablonovacím systémem. Můžete využít i filtry, jako je třeba  CurlyBracketsFilter:

// use NetteTemplatesTemplate;

$template = new Template;
$template->registerFilter('NetteTemplatesCurlyBracketsFilter::invoke');
$template->setFile('email.phtml');

$mail = new Mail;
$mail->setFrom('Franta <franta@example.com>')
        ->addTo('petr@example.com')
        ->setHtmlBody($template)
        ->send(); 

Do šablony se automaticky vloží proměnná $mail (a lze tedy přímo v šabloně nastavit další parametry emailu). Podstatné jsou následné operace, které Nette Framework s vygenerovaným HTML kódem udělá:

  • všechny obrázky vloží do e-mailu a odešle
  • nastaví subject podle obsahu elementu <title>
  • a sám vygeneruje alternativní textovou verzi

Může být odesílání e-mailů ještě jednodušší?


Seriál, seznamující vás se základy Nette Framework se dostal do svého finále. Přes svoji nemalou délku 17 dílů jsme většinu témat jen nakousli, hlubší prozkoumání by kolikrát vydalo na samostatný seriál. To platí především pro NetteApplication. Cílem seriálu však nebylo probrat framework do hloubky, ale představit jej a ukázat, že jde o produkt, který nejen snese srovnání se zahraniční konkurencí, ale v celé řadě klíčových oblastí vychází jako vítěz, neboť nabízí inovativní funkce, které žádná konkurence nemá.

Je proto skvělé, jestli se mi podařilo vzbudit ve vás zájem, a proto se teď možná ptáte „a co dál?“ Novinky okolo frameworku můžete sledovat na jeho webu http://nettep­hp.com nebo blogu phpFashion. Důležité praktické know-how a trénink můžete získat na školení. Všechny zájemce a zvědavce zvu na Poslední sobotu, neformální setkání vývojařů webových aplikací.

A vůbec nejlepší je zkusit si v Nette Framework napsat váš další web. Praxe je nejlepší škola a nebudete-li si vědět s něčím rady, poradí vám na fóru.

Autor článku je vývojář na volné noze, specializuje se na návrh a programování moderních webových aplikací. Vyvíjí open-source knihovny Texy, dibi a Nette Framework a pravidelně pořádá školení pro tvůrce webových aplikací, které od podzimu 2009 nabídne kurz vývoje AJAXových aplikací.

Komentáře

Subscribe
Upozornit na
guest
22 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
nes_ro

Doufám, že bude nějaké pokračování, třeba jen seriál
o NetteAppli­cation. Už dlouho si hraju s Nette a zkouším různé věci,
už se těším, až v tom udělám kompletní aplikaci. Občas si přijdu jako
takový Grudlovec, bez dibi už snad ani SQL syntaxi neumím. Navíc začínám
chápat, že Nette si na sebe nechá lehce zvykout, nemluvně o úžasné
Texy!. Prostě samá chvála. :-D Tak děkuju moc pane Grudle, děláte tak
úžasnou práci. :-)

dRaGen-

Vždycky sem zastával názor, že nechci používat cizí kód (ať už je
to framework nebo jenom nějaká knihovna), protože nevim co je tam za
zrůdnost a radši si tu zrůdnost napíšu sám, ale vyznam se v tom. Ale po
přečtení všech dílů, musím uznat, že je to perfektně napsaný ať
seriál tak i framework a doufám, že budete pokračovat. A velice ste mě
přesvědčil, že se na to nette asi fakt podívam :-)

Roman

Bolo to zaujímavé čítanie pri ktorom som si občas povzdychol
kurnikšopa načo si toto (či tamto) píšem sám. generovanie
formulárov, webalize.. kurňa…

Prvý framework do ktorého som sa zaľúbil na prvý pohlad bol jQuery
v máji 2007. Odvtedy ho používam prakticky pri všetkých javascriptových
úlohách a nemám problém sa vrátiť nazad aj keď nemám nijak úžasnú
štábnu kultúru.

O kvalite frameworku Netter ma presvedčilo aj to, že v ňom
naprogramovali novú verziu root.cz a z diaľky to vyzeralo ako
„brnkačka“. Stále sa obávam že preprogramovanie veľkých portálov
ktoré som robil by som do Nette len tak ľahko sám nezvládol (pretože je tam
veľa čiastovkých úloh a nikto by mi to ani nezaplatil), ale moje malé cms
v ňom prerobím hneď ako budem mat chvíľku času. U nette to je z láskou
na prvý pohľad ťažšie. Možno aj preto, že som zvyknutý na ADODB,
phpmail, veľa vecí mám už urobených po svojom (formuláre mám popísané
v poznámkach databázových polí ;-) a nette vyžaduje zčasti aj zmenu
myslenia, ale napriek tomu je mi tento framework a jeho autor veľmi sympatický
eleganciou a zmyslom pre humor.

tak príjemné prázdniny želám Davide.

jar

Díky za tento seriál. Myslel jsem, že bude trochu obsáhlejší, ale
i tak to stojí za to.

Martin Hassman

Rád bych podotknul, že se jedná o bezkonkurenčně nejdelší seriál zde
na Zdrojáku a když jsem jej na začátku s Davidem dohadoval, předpokládal
jsem, že bude rozhodně kratší. Nakonec mě David velmi potěšil, když
vydržel mnohem déle než všichni ostatní autoři.

Jasir

Díky Davide za skvělý seriál, ale hlavně za skvělý framework. Klobouk
dolů, všechna čest.

blizz.boz

Chcelo by to ešte kvalitnejšiu dokumentáciu niečo ako MSDN a hlavne mi ku
každej triede, metóde, atď chýbajú v dokumentácii príklady. Inak je to
prefektný framework ja sám som ho začal používať aj keď na veľa vecí
používam vlastné riešenia.

xstanda

jak si tak clovek cte o Nette, tak ma i chut se do nejakeho webu pustit :-D
Myslim, ze uzral cas, abych se po letech vratil k PHP a s pomoci Nette
frameworku a PHP se poradne zacal ucit objektove programovani (funkcionalni
zvladam ale php je uz nekde jinde nez na pocatku :) ). Premyslim, jestli mi to
Nette ulehci nebo to nezvladnu :-/ Prvnim soustem bude jednoducha www vizitka
pro sefika.

Trosku se prozatim ztracim v dokumentaci. je nekde popsana prace se
sablonami vcetne poladeni stylu, napr. kdyz chci pouzivat css soubor, misto aby
to psalo style=““ primo do tagu a dalsi podrobnosti???

hmm

Bože veď sú to algoritmíky na úrovni priemerných vysokoškolských
zadaní z programovania. Čo je na tom tak výnimočného, veď to len
vymýšľa koleso. Vymyslieť si imaginárny problém a spraviť na neho
riešenie dokáže každá programátorska lama. Skutoční programátori sú
v anonymite, nemajú na také bezvýznamné blbinky čas, keďže sú
dennodenne zasypaní skutočnými user požiadavkami. Chápete , pán Grudl –
reálny svet – poznáte to tam? Takéto PHP frejmvorčíky som si písal keď
som bastlil PHP weby a vôbec ma nenapadalo, že by som kôli tomu mal zakladať
kopu projektov, seriálov a konferencií. Čo je také úžasné na nette forms?
Pár classov generujúcich zopár input elementov. Chcete ultimatívne riešenie
pre formy? Skúste XForms… jaj .. ono to chce študovať manuály. Dibi ? Na
jednoduché selecty typu SELECT * FROM article WHERE id = %_GET[‚id‘] to
možno postačí, ale neuveríte SQL selecty môžu mať aj 500 riadkov, a
vôbec to neznamená, že sú zle napísané.

Lamicz

Nojo, ale Vy píšete ty Enterprise aplikace, které se pouze vyskytují na
hvězdné lodi Enterprise, částečně na Voyageru ;). My ostatní si holt
budeme bastlit no. To kolo se dělá stále znovu a znovu, akorát pokaždé
jinak, včetně Vašich XForms. nemužu si pomoct, ale u Nette i u Vás je
výsledkem ten blbej form ;) 500 SQL SELECTů bych řekl, že je něco
špatně. Asi jsem low, no.

MiKee

„Kolega“ programátor psal o SQL dotazu na 500 řádků, ne o 500 SQL
SELECTech. Určitě může být SQL dotaz na 500 řádků a rozhodně nemusí
být špatně. Ale přijde mi zvláštní, že ti opravdoví programátoři, co
nemají na takové blbosti čas, protože jsou zavaleni požadavky skutečných
userů, si najdou čas posoudit a vyplodit takové hodnocení pro framework
i seriál, za kterým stojí tolik precizní práce… Nenapadá mě lepší
poděkování než: „Upřímnou soustrast.“

Roman

Kolega zo slovenska tým nechcel povedať, že je „opravdový
programátor“, keby ním totiž bol, tak by takýto príspevok nikdy
nenapísal. „opravdoví programátori“ sú viac menej nahraditeľná
chamraď ktorej treba postaviť ohrádku (napríklad v podobe frameworku) aby
náhodou nezačali programovať tie svoje „riešenia“. O to viac sú
namyslení a urazení, že oni si to nemôžu robiť podla seba a že sú
nedocenení, v skutočnosti je nalepší programátor taký, čo robí to čo
sa mu povie, drží sa zadania a návrhy riešenia nechá na skúseného
analytika a projektanta. Meraž opravdovosť programátora počtom riadkov
selectu je taká istá hovadina ako sa hrdiť počtom napísaných riadkov
kódu. Naviac v praxi sú zložité selecty na webe zvyčajne najrýchlejšia
cesta do pekla ( couldn’t connect to the database ).

Honza

Stejně sis to napsal sám, abys neměl tolik pozitivních
komentářů! :-D

W

Chápete , pán Grudl – reálny svet – poznáte to
tam?

Prave ze ano. Realny svet neni v selectu na 500 radku a studovani manualu.
Je na te konferenci, vymyslet projekt, udelat skoleni, napsat serial, mit se
s kym opit, zvednout spouste lidi naladu a usnadnit praci. A to Nette dela.
Dela z programatoru lidi a z lidi programatory.

Přezdívka je povinná

„z programatoru lidi a z lidi programatory“ → Nette nedela nic a
(l)useru stale pribyva. – PHP sux and if you don’t like it, fill your crevice
with my ass and drown, you ugly motherfucking horse fucker.

Axiss

Jsem nevěděl, že se zamindrákovaní studenti na Slovensku stydí za své
názory a bojí se pod to co píší podepsat. Člověk se pořád učí.

Pitrsonek

A k čemu si přispěl ty tvým příspěvkem o govně? Takové chytráky
mám nejraději, kteří umí jen kritizovat. Na rozdíl od tebe David knihovny
alespoň poskytl, ale ty si je někde syslíš.

Filip Procházka

když jsem viděl poprvé Nette a hrabal se v tom tak jsem to vubec
nechapal, potom jsem se k tomu vratil asi po půl roce, protože jsem
potřeboval zbastlit jednoduchou aplikaci a Nette se zdál jako tahoun co mi to
usnadní. Kdybych se na tom neučil tak by mi to opravdu usnadnil, ale po týdnu
pocení krve proč mi nejede tady tahle blbinka a proč tady tahle, jsem se
naučil spoustu užitečných věcí a můžu říct, že když se s tím
člověk naučí dělat tak se ten kód píše skoro sám :)

Makeš

Gratuluji Davide,

k frameworku, i k seriálu. Nevím co dál bych řekl, možná, jen že ikdyž úplně všechny souvislosti uvnitř zatím nechápu, tak i tak mi připadne jako velice dobrý.. uvidíme po několika projektech co na něm připravuji. – Zatím paráda. :)

PS. Ten profík co tu byl :) Pěkné, ale že se vždycky někdo takový najde.. divím se že neodsuzoval i OOP (kód na víc.. ) No nic, jdu spát :)

Figi

Davide, musím smeknout…a to nejen před tvým úžasným dílem, ale i super vyjadřovacími schopnostmi. Něco tak srozumitelného jsem v oblasti programování ještě nečetl. ;-)) Celý seriál jsem doslova shltal za jeden večer. DÍKY, DÍKY, DÍKY!!!

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.