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 (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

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í.

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

Komentáře: 22

Přehled komentářů

nes_ro Úžasný seriál
dRaGen- Vynikající práce
Roman Vďaka,
jar Díky.
Martin Hassman Re: Díky.
Jasir Nette je vynikající
blizz.boz Re: Nette Framework: Co se do seriálu nevešlo?
David Grudl T h x
xstanda pekne
hmm ????
Lamicz Re: ????
MiKee Re: ????
Roman Re: ????
David Grudl Re: ????
Honza Re: ????
W Re: ????
Přezdívka je povinná Re: ????
Axiss Re: ????
Pitrsonek Re: ????
HosipLan Děkuju
Makeš Hm - moc pěkné Davide
Figi Klobouk dolů...;-)
Zdroj: https://www.zdrojak.cz/?p=3043