Jak použít šablony z Nette samostatně (pro začátečníky)

- David Grudl
- Nette Core | 8285
Rádi byste využili šablonovacího systému Nette v jednoduché nebo již existující aplikaci?
Specifikum Nette Frameworku je, že jeho části lze používat samostatně,
nebo naopak lze části frameworku nahradit vlastním kódem. I když budete
chtít použít jen šablonovací systém, doporučuji stáhnout a na web
nahrát celý framework – nakonec jde o pouhý jeden soubor
loader.php (při použití kompaktní verze).
Nejprve si tedy framework
stáhněte. Můžete buď použít klasickou verzi pro PHP 5.2, kde se
používají třídy jako Template, Object, Cache, …, nebo verzi
„prefixed“, kde jsou třídy prefixovány znakem N, takže
NTemplate, NObject, NCache, atd. Pokud by mohlo dojít ke kolizím
názvů tříd, doporučuji použít spíš verzi „prefixed“, pokud
plánujete přejít na PHP 5.3 a využívat jmenných prostorů, bude asi
lepší verze klasická.
Archív rozbalte a najdete v něm dva adresáře s frameworkem:
Nette a Nette.compact. První jmenovaný si
zkopírujte do jakéhokoliv adresáře, řekněme že to bude třeba
libs/Nette. Na server můžete naopak nahrát
Nette.compact – jde o ekvivalentní kód, jen je prostě
„zdrclý“ do jednoho souboru, takže se snadněji uploaduje a měl by
i rychleji běžet.
Dále si připravte adresář pro dočasné soubory. Například
temp. Ujistěte se (hlavně na serveru), že do adresáře lze
zapisovat.
A nyní ve svém kódu můžete použít šablonovací systém Nette. Nejprve ukázka pro „prefixed“ verzi frameworku:
// načteme framework
require_once 'libs/Nette/loader.php';
// volitené - můžeme zapnout Debug, pro šikovnější ladění aplikace
NDebug::enable();
// povinné - nastavíme cestu k dočasnému adresáři (nejlépe jako absolutní cestu)
NEnvironment::setVariable('tempDir', dirname(__FILE__) . '/temp');
$template = new NTemplate;
// následující kroky, až do renderování, mohou být uvedeny v libovolném pořadí
// zaregistrujeme filtr NCurlyBracketsFilter, který umožní používat syntax jako {if} ... {/if}, {foreach} ...
$template->registerFilter('NCurlyBracketsFilter::invoke');
// zaregistujeme tzv. helpery, který bude escapovat HTML znaky
$template->registerHelper('escape', 'NTemplateHelpers::escapeHtml');
$template->registerHelper('escapeJs', 'NTemplateHelpers::escapeJs');
$template->registerHelper('escapeCss', 'NTemplateHelpers::escapeCss');
// určíme soubor se šablonou
$template->setFile('sablona.phtml');
// předáme ji parametry
$template->name = 'Jack';
$template->people = array('John', 'Mary', 'Paul');
// a vyrenderujeme
$template->render();
A ještě totéž pro neprefixovou verzi:
require_once 'libs/Nette/loader.php';
Debug::enable();
// povinné - nastavíme cestu k dočasnému adresáři (nejlépe jako absolutní cestu)
Environment::setVariable('tempDir', dirname(__FILE__) . '/temp');
$template = new Template;
// zaregistrujeme filtr a helpery
$template->registerFilter('CurlyBracketsFilter::invoke');
$template->registerHelper('escape', 'TemplateHelpers::escapeHtml');
... // a zbytek už je stejný
Jak může vypadat soubor se šablonou (sablona.phtml):
<h1>Hello {$name}</h1>
<ul>
{foreach $people as $person}
<li>{$person}</li>
{/foreach}
</ul>
V cyklech {foreach} lze také využít magickou proměnnou
$iterator:
{foreach $people as $person}
<p id="item{$iterator->getCounter()}">{$person}</p>
{if !$iterator->isLast()}
<hr />
{/if}
{/foreach}
Podrobnější informace o syntaxi a proměnné $iterator
najdete přímo
v dokumentaci.
V samotné šabloně je lepší se vyvarovat používání PHP. Pokud bychom chtěli třeba volat funkci str_pad pro zarovnávní řetězce na zadaný počet míst, bude lepší využít helper:
// název funkce je libovolný
function justifyHelper($s, $length = 3)
{
return str_pad($s, $length, ' ', STR_PAD_LEFT);
}
// a zaregistrujeme jej do šablony pod názvem 'justify' (vložte do předchozího kódu)
$template->registerHelper('justify', 'justifyHelper');
V šabloně jej použijeme takto:
{foreach $people as $person}
<li>{$person|justify}</li>
{/foreach}
Přičemž můžeme předat navíc parameter (bude předán jako druhý argument funkci justifyHelper):
<li>{$person|justify:10}</li>
Za sebe můžeme dokonce naskládat více helperů, např
{$person|lower|justify}.