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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

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

Kazan
Člen | 2
+
0
-

Ve třetím odstavci se kus textu opakuje.
Díky za návod pro začátečníky (: