nette 2.2 jak správně načíst vlatní helpery
- zool
- Člen | 144
Zdravím jak v nejnovějším nette zaregistrují helpery
vždy jsem používat v mětodě
createTemplate
funkci
$template->registerHelperLoader(callback(
$this->templateHelpers,
'loader'
));
ale v novém již to nejde, tak jsem použil toto
$template->getLatte()->addFilter('loader',$this->templateHelpers);
to je sice v pořádku, ale nejdou helpery používat v šablonách.
Díky
- David Matějka
- Moderator | 6445
zhruba takhle:
$template->getLatte()->addFilter(NULL, array($this->templateHelpers, 'loader'));
- rixi
- Člen | 109
zool napsal(a):
Děkuju už stránky najely ale , místo toho aby to použilo ten helper, tak to vypsalo
Helpers\Helpers::timeagoinwords
má se tam ještě neco napsat?
v šabloně to mám zapsané takto {$akce->datum_konec|timeAgoInWords}
k tomuto bodu stavu som sa dostal aj ja, robil som to narychlo a zatial som nemal cas to dalej riesit. ale keby tu niekto postol riesenie, resp. dovod preco to robi, tak mi to usetri robotu
- Jan Tvrdík
- Nette guru | 2595
Ten loader se musí napsat jinak. Místo aby vracel callback, tak musí vracet přímo to hudnotu.
Tedy např.
public function loader($name, $s)
{
if (method_exists($this, $name) return $this->$name($s);
else return null;
}
- Tomáš Votruba
- Moderator | 1114
Zkusil bych něco tímto směrem. První parametr bude zřejmě název, takže ten bude potřeba z pole vyjmout.
call_user_func_array($method, func_get_args());
Editoval Tomáš Votruba (26. 4. 2014 19:38)
- Mysteria
- Člen | 797
@pitr82: Pokud chceš vytvořit jenom pár helperů:
$this->template->addFilter('number', function($s, $dec = 0) { return number_format($s, $dec, ',', "\xe2\x80\x87"); });
Pokud chceš vytvořit třídu s helperama, tak použij návod pro 2.1 https://latte.nette.org/cs/#…, s tím že tu metodu loader($helper) upravíš tak, jak mám v příspěvku 11 a pak je loadneš takhle:
$this->template->addFilter(NULL, ['\Utils\Helpers', 'loader']);
- Jironett
- Člen | 3
Zdravím,
registraci helper loaderu né a né rozchodit.
public function renderDefault(){
$this->template->addFilter(NULL, ['\Jironett\Helpers', 'loader']);
...
}
A helper
namespace Jironett\Helpers;
class Helpers
{
public static function loader($helper) {
if (method_exists(__CLASS__, $helper)) return call_user_func_array("\Jironett\Nette\Helpers::$helper", array_slice(func_get_args(), 1));
}
public static function myHelper($param)
{ ... }
Jenže neustále mi vyskakuje hláška: Callback
‚\Jironett\Helpers::loader‘ is not callable.
Nemá někdo nápad, kde by mohl být problém. Proč není třída helpres
viditelná?
Editoval Jironett (9. 6. 2014 14:45)
- Jan Tvrdík
- Nette guru | 2595
@Jironett: Nauč se pracovat s jmennými prostory v PHP, pak nebudeš mít takové problémy. Správně je to
['Jironett\Helpers\Helpers', 'loader']
nebo spíš
'Jironett\Helpers\Helpers::loader'
- Jironett
- Člen | 3
V namespace to není – přepsal jsem se, pro názornost, je to takto:
namespace Jironett\Helpers;
class Helpers {
... return call_user_func_array("\Jironett\Helpers\Helpers::$helper", array_slice(func_get_args(), 1));
A bohužel ani takto to nefunguje
Callback ‚\Jironett\Helpers\Helpers::loader‘ is not callable.
$this->template->addFilter(NULL, '\Jironett\Helpers\Helpers::loader');
- ludek
- Člen | 83
Mně jde filter (helper) zaregistrovat docela jednoduše:
1. soubor s helpery dám někam, kde ho robot loader najde, třeba
app/tools/Helpers.php
uvnitř je třída
class Helpers {
public static function timeAgoInWords($time) {
//slovní vyjádření času od Davida Grudla
//....
}
}
2. v presenteru obyčejně napíšu
public function renderDefault() {
$this->template->addFilter('ago','Helpers::timeAgoInWords');
}
3. a v šabloně už jen
<table>
<tr n:foreach="$data as $d">
<td>
{$d->datum|date:'%d.%m.%Y'} což je {$d->datum|ago}
</td>
</tr>
</table>
Určitě funkční v Nette 2.2.3.
Editoval ludek (15. 12. 2014 14:14)