Pro mě záhada: 2 helpery v helpers.php → jeden funguje a druhý ne
- ras
- Člen | 135
Ahoj všem,
mám jeden soubor pro svoje helpery → helpers.php, kde je mimo jiné toto
class Helpers extends MTH {
public function realizationMainThumb($s, $title) {
// nejaky kod
}
public function realizationDetailPhoto($s) {
// nejaky kod
}
}
a pak mám jeden latte file, kde je mimo jiné toto
.... kód ...
{!$realization['img4thumb']|realizationMainThumb:$realization['thumbTitle']}
.... kód ...
{$item|realizationDetailPhoto}
.... kód ...
Helper realizationMainThumb funguje a při použití realizationDetailPhoto laděnka hlásí
LogicException
Call to undefined method Latte\Template::realizationDetailPhoto()
Problém není v obsahu těch proměnných, tam by klidně mohlo být
i prázdné $foo.
Je fuk, jestli realizationDetailPhoto přejmenuji na obou místech na něco
jiného, vždy se objeví stejná hláška.
Je fuk, jestli vezmu jakýkoliv jiný helper z helpers.php a nahradím jím
v latte realizationDetailPhoto, chová se to vždy stejně, tj. helper
(protože je dělaný na něco jiného) začne křičet, nějakou syntaktickou
chybu, což je úplně v pořádku … ale funguje a né, že to píše zmého
pohledu pitomost jako „undefined method“
Registrace helperu probíhá přes config services
services:
- App\Helpers
Dokážete mi někdo tuto „záhadu“ objasnit?
Díky všem ufologům :o)
Radek
- David Matějka
- Moderator | 6445
Registraci tridy jako sluzby neregistrujes filtry. Filtry se registruji takto
- ras
- Člen | 135
Já sem to tam neměl psát .o) … chtěl jsem tím naznačit, že načítání helperů je identické a automatizované … tj. dále je to v kódu řešeno přes (dle názvosloví z tvého odkazu) univerzální helper … tj. je tam loader.
To je právě to, co na tom nechápu, že to u jednoho funguje a u druhého ne.
- ras
- Člen | 135
abstract class Helpers extends Object {
/**
* Autoloder for helpers
*
* @param string $method
*/
public function loader($method) {
if (method_exists($this, $method)) {
$args = func_get_args();
unset($args[0]);
return call_user_func_array(array($this, $method), $args);
}
return NULL;
}
....
to je v podstate kopie toho na co jsi odkazoval
a volano je to
// Register helpers
$template->registerHelperLoader(callback($this->helpers, 'loader'));
Nikde si neregistruji jednotlivé helpery sólo … pak by to bylo jasné, někde by ten nový chyběl, ale takto mě to rozdílné chování trochu … překvapuje :o(
- ras
- Člen | 135
Tak jo, záhada hlavolamu vyřešena → měl jsem ten nový helper rozpracovaný, tj. nebyl ještě celý a chtěl jsem si jen něco z něj vypsat a pak pokračovat v jeho dodělání … takže jsem jsem tam neměl RETURN → a tím vznikla ta hláška, která je (podle mě) trochu zavádějící, ale po doplnění return "" je to již vše OK … prostě pitomina .o)
Díky za čas a ochotu!
- David Matějka
- Moderator | 6445
Hlaska vypada, ze je zavadajici, ale je naprosto v poradku – NULL totiz loader vraci, kdyz neobsahuje dany filter. latte nema sanci rozpoznat, jestli tedy loader vratil NULL kvuli chybejicimu filtru, nebo jestli ten null byl vracen filterem.
- David Grudl
- Nette Core | 8235
V 2.2.3 by ta hláška měla být
Filter realizationDetailPhoto is not defined
- ras
- Člen | 135
David Grudl napsal(a):
V 2.2.3 by ta hláška měla být
Filter realizationDetailPhoto is not defined
LogicException
Filter 'foo' is not defined.
Hlášku mohu potvrdit – díky za úpravu.
Ale i tato hláška je trochu zavádějící v případě, že výstup
z filtru je NULL, když
je helper
public function foo($s) {
return is_string($s) ? 'OK' : $s;
}
tj. když v příkladě je $s = NULL.
V tuto chvíly vypisovat, že filter není defined není úplně nejvhodnější → pořád jsem na něj koukal a říkal si jak je možné, vždyť ho tam přece mám :O).
- David Matějka
- Moderator | 6445
@ras, jak jsem psal:
latte nema sanci rozpoznat, jestli tedy loader vratil NULL kvuli chybejicimu filtru, nebo jestli ten null byl vracen filterem.
tak vracej (string) $s
a mas to vyreseno :)
ale asi by se to aspon mohlo doplnit do doc, ze filter neme vracet NULL..