Jak použít šablony z Nette samostatně (pro začátečníky)
- David Grudl
- Nette Core | 8218
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}
.