Helpery v šablonách a filtru curlyBrackets

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

Do šablon je nyní možné zaregistrovat helpery, tj. pojmenované funkce:

Příklad kódu presenteru:

$this->template->registerHelper('upper', 'strtoupper');

Příklad šablony:

...
<h1><?php echo $template->upper($heading) ?></h>
...

Virtuální metoda upper se mapuje na metodu strtoupper. Jako helper je samozřejmě možné zaregistrovat jakýkoliv callback, nejen název funkce.

Helpery podporuje i filtr curlyBrackets za použití této syntaxe:

<h1>{$heading|upper}</h1>

Je možno zřetězit více helperů (resp. modifikátorů):

<h1>{$heading|lower|capitalize}</h1>

Vykonají se v pořadí od levého k pravému.

Honza Marek
Člen | 1664
+
0
-

A to, že mi přestalo fungovat {block texy}{!promenna}{/block} je důsledek tohoto? Vyhazuje mi to InvalidStateException(The helper 'texy' was not registered.).

Už jsem teda helper zaregistroval, ale znepokojilo mě to…

David Grudl
Nette Core | 8142
+
0
-

Honza M. napsal(a):

A to, že mi přestalo fungovat {block texy}{!promenna}{/block} je důsledek tohoto? Vyhazuje mi to InvalidStateException(The helper 'texy' was not registered.).

Už jsem teda helper zaregistroval, ale znepokojilo mě to…

Jo, to bylo tím, sorry. Zůstaň u registrace.

Honza Marek
Člen | 1664
+
0
-

Ono je beztak {!promenna|texy} pohodlnější…

xificurk
Člen | 121
+
0
-

Eh, asi jsem natvrdlý… do teď jsem si v proměnné TemplateFilters::$texy držel jednu instanci Texy a tu používal buď přímým voláním, nebo cpal do šablony pomocí $this->template->texy = TemplateFilters::$texy; v BasePresenteru a používal jak pro svoje předefinovené Cb filtry, tak pro {block|texy}. Jak, že se to teď má správně rozchodit?

_Martin_
Generous Backer | 679
+
0
-
David Grudl
Nette Core | 8142
+
0
-

Značky {block} se nově dají použít pro zachytávání výstupu do proměnné:

{block $capture}
<ul>
	<li>Hello World</li>
</ul>
{/block}

<p>Captured: {$capture}</p>

Aktualizace: Pro zachytávání slouží značka {capture $var} ... {/capture}

Zachytávání je přitom možné kombinovat i s modifikátory.

Honza Marek
Člen | 1664
+
0
-

Dovolil jsem si to vytáhnout do dokumentace (Templates).

Roman Pištěk
Člen | 10
+
0
-

Jen drobný tip pro formátování české měny:

<?php
	$template->registerHelper('money', create_function('$s', 'return number_format($s, 0, NULL, " ");'));
?>

Použití helperu v šabloně (s filtrem CurlyBrackets) je nasnadě:

<?php
	{$amount|money}
?>

Z typografického hlediska je škoda, že funkce number_format() u posledního parametru (thousands_sep) bere jen první znak a tisícové řády nejdou prostrčit nezalamovatelnou mezerou. (Lze to řešit vlastní funkcí…)

phx
Člen | 651
+
0
-

Roman Pištěk napsal(a):

Z typografického hlediska je škoda, že funkce number_format() u posledního parametru (thousands_sep) bere jen první znak a tisícové řády nejdou prostrčit nezalamovatelnou mezerou. (Lze to řešit vlastní funkcí…)

Co to zaobalit do str_replace, kde nahradim mezeru za pevnou mezeru? Osobne bych to ale udelal takto:

return str_replace(' ', '&nbsp;', number_format($number, 2, ',', ' ').' Kč');

Snad mam dobre poradi parametru, furt si to nemuzu zapamatovat.

Roman Pištěk
Člen | 10
+
0
-

Trošku přes koleno, ale asi nejjednodušší cesta, nic rychlejšího mě nenapadá…

David Grudl
Nette Core | 8142
+
0
-

Na e-shopu, kde nejsou haléře, používám tohle:

abstract class Helpers
{
	public static function money($value)
	{
		return str_replace(" ", "\xc2\xa0", number_format($value, 0, "", " ")) . "\xc2\xa0Kč";
	}
}

Pokud by se použila entita &nbsp;, nebylo by možné psát {$amount|money}, ale {!$amount|money}. Znak \xc2\xa0 je v UTF-8 non-breaking space.