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)