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: 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ů.

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

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 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 Nette\Web\HttpR­equest a Nette\Web\HttpR­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 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="&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&#64;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.

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ů, 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://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

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ů

Úžasný seriál
nes_ro 30. 6. 2009 01:00
Nový
Vynikající práce
Jakub Kohout 30. 6. 2009 01:16
Nový
Vďaka,
Roman 30. 6. 2009 08:23
Nový
Díky.
jar 30. 6. 2009 10:14
Nový
└ 
Re: Díky.
Martin Hassman 30. 6. 2009 11:10
Nový
Nette je vynikající
Jasir 30. 6. 2009 11:57
Nový
Re: Nette Framework: Co se do seriálu nevešlo?
blizz.boz 30. 6. 2009 13:21
Nový
T h x
David Grudl 30. 6. 2009 13:23
Nový
pekne
xstanda 30. 6. 2009 19:03
Nový
????
hmm 1. 7. 2009 01:21
Nový
├ 
Re: ????
Lamicz 1. 7. 2009 02:08
Nový
│
└ 
Re: ????
MiKee 1. 7. 2009 02:29
Nový
│
 
└ 
Re: ????
Roman 1. 7. 2009 08:19
Nový
├ 
Re: ????
David Grudl 1. 7. 2009 08:40
Nový
│
└ 
Re: ????
Honza 1. 7. 2009 09:18
Nový
├ 
Re: ????
W 1. 7. 2009 10:25
Nový
│
└ 
Re: ????
Přezdívka je povinná 2. 7. 2009 22:31
Nový
├ 
Re: ????
Axiss 4. 7. 2009 00:53
Nový
└ 
Re: ????
Pitrsonek 7. 7. 2009 11:37
Nový
Děkuju
Hosip Lan 9. 7. 2009 19:48
Nový
Hm - moc pěkné Davide
Makeš 2. 8. 2009 22:33
Nový
Klobouk dolů...;-)
Figi 16. 12. 2010 23:19
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