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 imagefilledrectangle, 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 NetteWebHttpRequest a NetteWebHttpResponse. 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="<script>alert()</script>" />
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.
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://nettephp.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í.
Přehled komentářů