Nette Framework: Co se do seriálu nevešlo?
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ů.
Seriál Začínáme s Nette Framework
- Nette Framework: Neprůstřelné formuláře
- Nette Framework: Neprůstřelné formuláře II
- Nette Framework: Neprůstřelné formuláře III
- Nette Framework: Cache
- Nette Framework: Co se do seriálu nevešlo?
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 Nette\Image, 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 Nette\Image;
$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 Nette\Web\HttpRequest a Nette\Web\HttpResponse. 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 Nette\Environment;
$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 Nette\String 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 Nette\String;
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 Nette\Web\Html 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 Nette\Web\Html;
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 Nette\Paginator . 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 Nette\Paginator;
$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ů, Nette\Mail .
// use Nette\Mail\Mail;
$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 Nette\Templates\Template;
$template = new Template;
$template->registerFilter('Nette\Templates\CurlyBracketsFilter::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 Nette\Application. 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í.
Školení Google+ pro firmy

- 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+ »
Seriál Začínáme s Nette Framework
- Nette Framework: Neprůstřelné formuláře
- Nette Framework: Neprůstřelné formuláře II
- Nette Framework: Neprůstřelné formuláře III
- Nette Framework: Cache
- Nette Framework: Co se do seriálu nevešlo?
Přehled názorů
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.