Helpery v šablonách a filtru curlyBrackets
- David Grudl
- Nette Core | 8218
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 | 8218
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 | 8218
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 | 8218
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.