Helpery v šablonách a filtru curlyBrackets

- David Grudl
- Nette Core | 8285
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
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 | 8285
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.

- xificurk
- Člen | 121
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?

- David Grudl
- Nette Core | 8285
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.

- Roman Pištěk
- Člen | 10
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
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(' ', ' ', number_format($number, 2, ',', ' ').' Kč');
Snad mam dobre poradi parametru, furt si to nemuzu zapamatovat.

- Roman Pištěk
- Člen | 10
Trošku přes koleno, ale asi nejjednodušší cesta, nic rychlejšího mě nenapadá…

- David Grudl
- Nette Core | 8285
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 , nebylo by možné psát
{$amount|money}, ale {!$amount|money}. Znak
\xc2\xa0 je v UTF-8 non-breaking space.