registerHelperLoader Callback ‚Helpers::loader‘ is not callable

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

Ahoj, zkoušel jsem podle navodu v dokumentaci implementovat do projektu Helper Loader a nějako se mi to nedaří.

<?php

namespace FrontModule;

use BeCMS\Helpers;

class FrontPresenter extends \BeCMS\BasePresenter {

    /**
    * (non-phpDoc)
    *
    * @see Nette\Application\Presenter#startup()
    */

    protected function startup()
    {
        parent::startup();
    }

    protected function createTemplate($class = NULL)
    {
        $template = parent::createTemplate();
        $template->registerHelperLoader('Helpers::loader');
        return $template;
    }
...

chtel jsem docilit toho abych mel helpery dostupne ve vsech Presenterech dedicich od FrontPresenteru a nemusel tak loader vzdy volat. No jenze „zlá a zákeřná“ laděnka mi vrací
Callback ‚Helpers::loader‘ is not callable.

Už jsem vyzkoušel vše co mě napadlo a pohledal vše co se dalo, ale asi mi dnes není z hůry dáno. Děkuju za pomoc!

Editoval besir (25. 7. 2012 14:46)

Jan Endel
Člen | 1016
+
0
-

Ukaž třídu Helpers

besir
Člen | 170
+
0
-

pilec napsal(a):

Ukaž třídu Helpers

<?php

namespace BeCMS;

class Helpers
{

    public static function loader($helper)
    {
        if (method_exists(__CLASS__, $helper))
        {
            return callback(__CLASS__, $helper);
        }
    }

    public static function timeAgoInWords($time)
    {
...
ViPEr*CZ*
Člen | 814
+
0
-

Zkus tam namísto __CLASS__ dát $this a metodu loader bych zkusil vyhodit static (podle planette).

besir
Člen | 170
+
0
-

ViPErCZ napsal(a):

Zkus tam namísto __CLASS__ dát $this a metodu loader bych zkusil vyhodit static (podle planette).

Zadna zmena, původně jsem si myslel, že mám chybu v Namespace a že se na tu metodu nedostane. To jsem si otestoval. Tím to neni. Laboruju s tím celé dopoledne :-( No ted už odpoledne :D

Editoval besir (25. 7. 2012 15:30)

ViPEr*CZ*
Člen | 814
+
0
-

Napadá mě, že tomu překáží ten namespace. Zkusil bych ho tam nacpat taky:

$template->registerHelperLoader('BeCMS\Helpers::loader');
besir
Člen | 170
+
0
-

ViPErCZ napsal(a):

Napadá mě, že tomu překáží ten namespace. Zkusil bych ho tam nacpat taky:

$template->registerHelperLoader('BeCMS\Helpers::loader');

Super perfekt, chyba byla v Namespace, zmátlo mě to, že když jsem si udělal metodu foo() tak mi to fungovalo, ale volala sem ji normalne jako statickou metodu Helpers::foo();

Děkuju!

Shrnu pro budoucí bloudící:

Pokud používáte Nette s Namespaces a třeba různé moduly jako já

Definice helperů:
!! pozor, výše zmíněný $this místo __CLASS__ NEFUNGUJE!

<?php

namespace BesirCMS;

class Helpers
{
    public static function loader($helper)
    {
        if (method_exists(__CLASS__, $helper))
        {
            return callback(__CLASS__, $helper);
        }
    }

    public static function timeAgo($time)
    {
...

Volání helperLoaderu

<?php

namespace FrontModule;

class FrontPresenter extends \BesirCMS\BasePresenter {

    protected function startup()
    {
        parent::startup();
    }

    protected function createTemplate($class = NULL)
    {
        $template = parent::createTemplate();
        $template->registerHelperLoader('BesirCMS\Helpers::loader');
        return $template;
    }
...

Snad to pomůže někomu dalšímu a nebudu sám trouba :D

Filip111
Člen | 244
+
0
-

Navážu na téma – už jsem měl v helperech trochu bordel, takže jsem je taky přesunul do loaderu.
Teď ale dostávám chybu, že Helpers::jobTitle() should not be called statically

Musí být helpery vždy statické funkce nebo nikoliv?
Např v tomto článku z planette je příklad helperu profilePicture kde je helper definován jako nestatiská metoda.

Ukázka mého helperu:
(metoda catalog vrací indexované pole)

class Helpers {

	private $jobsRepo;

	public function __construct($jobsRepo) {
		$this->jobsRepo = $jobsRepo;
	}

	public static function loader($helper) {
		if (method_exists(__CLASS__, $helper)) {
			return callback(__CLASS__, $helper);
		}
	}

	public function jobTitle($jobId) {
		$catalog = $this->jobsRepo->catalog();
		if (isset($catalogg[$jobId])) {
			return $catalog[$jobId];
		} else
			return '?';
	}
}
Jan Endel
Člen | 1016
+
0
-

To hlásí protože v té metodě máš $this.
Btw return otazníku v této metodě je vyloženě WTF.

Filip111
Člen | 244
+
0
-

Já vím, že $this ve statické metodě nelze použít, ale právě např v odkazovaném příkladu z planette je v metodě profilePicture také použité $this. Tzn. odkazovaný příklad z planette je taky blbě nebo lze vytvořit helper a volat ho pomocí helper loaderu dynamicky tak aby výše uvedený helper jobTitle fungoval?

return otazníku je možná WTF, ale jsou to namigrovaný data, který bohužel nemusí být 100% správně a pokud tam vyhodim exceptionu, uvidím ji každou chvíli.

MartyIX
Člen | 217
+
0
-

Filip111 napsal(a):

Já vím, že $this ve statické metodě nelze použít, ale právě např v odkazovaném příkladu z planette je v metodě profilePicture také použité $this. Tzn. odkazovaný příklad z planette je taky blbě nebo lze vytvořit helper a volat ho pomocí helper loaderu dynamicky tak aby výše uvedený helper jobTitle fungoval?

Neni, ty mas: public static function loader v clanku loader neni static!

Filip111
Člen | 244
+
0
-

Myslel jsem, že funkce loader musí být static – už jsem to opravil, včetně samotné třídy loader, kde nesmí být callback s __CLASS__ ale s $this a funguje to.

Celej problém vznikl proto, že jsem kombinoval zdrojáky z téhle diskuse a z planette a neuvědomil si rozdíly.

Dík.