Pro mě záhada: 2 helpery v helpers.php → jeden funguje a druhý ne

ras
Člen | 135
+
0
-

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

Registraci tridy jako sluzby neregistrujes filtry. Filtry se registruji takto

ras
Člen | 135
+
0
-

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.

David Matějka
Moderator | 6445
+
0
-

ukaz, jak vypada loader a jak ten loader registrujes

ras
Člen | 135
+
0
-
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
+
0
-

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

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

V 2.2.3 by ta hláška měla být Filter realizationDetailPhoto is not defined

ras
Člen | 135
+
0
-

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

@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..

RSS tématu Téma zavřeno