nette 2.2 jak správně načíst vlatní helpery

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
zool
Člen | 144
+
0
-

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
+
0
-

zhruba takhle:

$template->getLatte()->addFilter(NULL, array($this->templateHelpers, 'loader'));
zool
Člen | 144
+
0
-

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}

Editoval zool (24. 4. 2014 23:20)

rixi
Člen | 109
+
0
-

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

Mysteria
Člen | 797
+
0
-

Mám stejný problém a došel jsem ke stejnému konci jako zool a rixi. Kdyby měl někdo řešení, podělte se. :)

Jan Tvrdík
Nette guru | 2595
+
+2
-

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;
}
Mysteria
Člen | 797
+
0
-

@Jan Tvrdík: Díky, po úpravě na statickou verzi funguje bez problémů. :)

zool
Člen | 144
+
0
-

Jo takhle, děkuji, ale jak předám těm metodám ty parametry?

Tomáš Votruba
Moderator | 1114
+
0
-

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)

zool
Člen | 144
+
0
-

Tak možná asi takto

public function loader($name)
{
    $name = func_get_args();
    $func = $name[0];
    unset($name[0]);
    if (method_exists($this, $func))
    {
        return call_user_func_array(array($this, $func), $name);
    }
    else return null;
}
Mysteria
Člen | 797
+
0
-

A kdyby někdo náhodou v budoucnu hledal řešení pro statický metody, tak třeba takhle:

public static function loader($helper) {
	if (method_exists(__CLASS__, $helper)) return call_user_func_array("\Utils\Helpers::$helper", array_slice(func_get_args(), 1));
}
pitr82
Člen | 121
+
0
-

Dobrý den,
můžete mi prosím předvést příklad, jak si zaregistruji helper timeAgoInWords
popřípadě, jak si mohu vytvořit vlastní helper ve verzi 2.2 ?

Mysteria
Člen | 797
+
0
-

@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
+
0
-

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
+
0
-

@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
+
0
-

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');
Mysteria
Člen | 797
+
0
-

Hoď sem celou tu třídu s helperama + jak to načítáš v BasePresenteru.

jasin755
Člen | 116
+
0
-

Lze toto celé napsat nějak do configu ?

Etch
Člen | 403
+
+1
-
services:
	nette.latteFactory:
		setup:
			- addFilter(null, [Tools\Helpers(), 'loader'])

Editoval Etch (11. 12. 2014 14:47)

ludek
Člen | 83
+
+2
-

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)