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

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
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
Nette Core | 8235
+
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..