Call to a member function infoUser() on a non-object

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

Zdravím,
potřeboval bych pomoci rozluštit záhadu.

<?php
Pokud v HomepagePresenter.php v renderDefault() vložím
$this->template->infos = $this->userRepository->infoUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);

a v šabloně použiji {$infos->firstname}

Vše funguje. Ale jelikož potřebuji tuto hodnotu předávat všem šablonám, postupoval jsem podle návodu který jsem si tu našel, že mám použít v BasePresenter.php:

public function beforeRender()
    {
        parent::beforeRender();
        $this->template->infos = $this->userRepository->infoUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);

    }


?>

Tak ihned dostávám chybu Call to a member function infoUser() on a non-object

Zkoušel jsem projít fórum, dva příspěvky jsem našel ale žádný neseděl na řešení mého problému.
Mohu poprosit někoho zkušenějšího o nasměrování? Děkuji

nanuqcz
Člen | 822
+
0
-

Napadají mě dvě možné příčiny:

  1. Tvůj HomepagePresenter nedědí z BasePresenter.
  2. V HomepagePresenter máš metodu beforeRender(), která nevolá parent::beforeRender()

Jestli jsem se netrefil, bude nejlepší dát sem celou laděnku. 

EDIT: Sry, blbě jsem si přečetl dotaz :-) Jakým způsobem do presenteru dostáváš userRepository?

Editoval nanuqcz (9. 4. 2013 14:32)

Jan Endel
Člen | 1016
+
0
-

A base presenter má property userRepository?

oskarmaniak
Člen | 29
+
0
-

V HomepagePresenter mám

<?php
public function beforeRender()
    {
        parent::beforeRender();

    }

Jestli děděním máš na mysli ???

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

Tak toto tam mám
?>

Ještě takový poznatek, pokud jsem to volané z HomepagePresenter.php dal do UserPresenter, atd tak to hodilo stejnou chybu, ale přitom jsem nenašel v HomepagePresenter co bych měl jinak než v těch ostatních. Několikrát jsem to prohlížel a asi mi něco utiká.

Celá laděnka:

<?php
File: .../nfcattendance.com/app/presenters/BasePresenter.php   Line: 49

39:
40:            $this->translator->setLang($this->lang);
41:            $template->setTranslator($this->translator);
42:
43:        return $template;
44:    }
45:
46:    public function beforeRender()
47:        {
48:            parent::beforeRender(); // nezapomeňte volat metodu předka, stejně jako u startup()
49:            $this->template->infos = $this->userRepository->infoUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);
50:
51:            $this->template->menuItems = array(
52:                'Domů' => 'Homepage:',
53:                'Produkty' => 'Products:',
?>

BasePresenter.php

<?php
<?php

/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{

    private $userRepository;


/** @persistent */
public $lang;

/** @var NetteTranslator\Gettext */
protected $translator;


/**
 * Inject translator
 * @param NetteTranslator\Gettext
 */
public function injectTranslator(NetteTranslator\Gettext $translator)
{
    $this->translator = $translator;
}

public function createTemplate($class = NULL)
{
    $template = parent::createTemplate($class);

        $this->translator->setLang($this->lang);
        $template->setTranslator($this->translator);

    return $template;
}

public function beforeRender()
    {
        parent::beforeRender();
        $this->template->infos = $this->userRepository->infoUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);

    }

public function flashMessage($message, $type = "info")
{
        if (isset($this->lang)) {
        $this->lang = $this->lang;
        }
        else {
        $this->lang = $this->translator->getLang();
        }
        $this->translator->setLang($this->lang); // toto je nové
    $message = $this->translator->translate($message);
    return parent::flashMessage($message, $type);
}

}

?>

HomepagePresenter

<?php

/**
 * Homepage presenter.
 */
class HomepagePresenter extends \BasePresenter
{

    /** @var \Dochazka\UserRepository */
    private $userRepository;

    /** @var \Dochazka\PassRepository */
    private $passRepository;

    /** @var \Dochazka\TagRepository */
    private $tagRepository;

    /** @var int */
    private $accountData;

    protected function startup() {
        parent::startup();
        $this->userRepository = $this->context->userRepository;
        $this->passRepository = $this->context->passRepository;
        $this->tagRepository = $this->context->tagRepository;

        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        } else {
            $this->accountData = $this->getUser()->getIdentity()->getData();
        }


    }

     public function actionPass($uid) {

        if ($uid) { // we're saving passes
                $this->lang = $this->getUser()->getIdentity()->lang;
                $this->translator->setLang($this->lang);
            if ($this->passRepository->addPass($this->getUser()->getId(), $this->getUser()->getIdentity()->admin, $uid)) {
                $this->flashMessage('Passage saved', 'success');
            } else {
                $this->flashMessage('Error saving the passage', 'error');
            }
            $this->redirect('Homepage:pass');
        }
        //$this->template->pruchody = $this->passRepository->findPassesForUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);
    }


public function beforeRender()
    {
        parent::beforeRender();

    }

    public function renderDefault() {

        if ($this->getUser()->getIdentity()->level > 0) // show all passes only for admin account
            $this->template->pruchody = $this->passRepository->findPassesForAccount($this->getUser()->getIdentity()->admin);
        else
            $this->template->pruchody = $this->passRepository->findPassesForUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);
        $this->template->pruchodypersonal = $this->passRepository->findPassesForUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);

    }
}

?>
oskarmaniak
Člen | 29
+
0
-
<?php
na začátku    private $userRepository;

a pak

$this->userRepository->infoUser($this->getUser()->getId(), $this->getUser()->getIdentity()->admin);
?>

nanuqcz napsal(a):

Napadají mě dvě možné příčiny:

  1. Tvůj HomepagePresenter nedědí z BasePresenter.
  2. V HomepagePresenter máš metodu beforeRender(), která nevolá parent::beforeRender()

Jestli jsem se netrefil, bude nejlepší dát sem celou laděnku. 

EDIT: Sry, blbě jsem si přečetl dotaz :-) Jakým způsobem do presenteru dostáváš userRepository?

hAssassin
Člen | 293
+
0
-

Toto z HomepagePresenteru presun do BasePresenteru:

/** @var \Dochazka\UserRepository */
private $userRepository;

// Metoda startup()
$this->userRepository = $this->context->userRepository;

P.S. Dedeni znamena class HomepagePresenter extends \BasePresenter coz mas OK, ale asi nevis co to je :-)

oskarmaniak
Člen | 29
+
0
-

Zabralo velice děkuji za radu a novou vědomost o nette :)
Plavu v něm druhým týdnem stylem pokus omyl :) A tady mi unikala přesná funkce logicky a ještě teda ani zcela nechápu proč tou změnou co jsi napsal to začalo fungovat.

Chcili tedy z Presenteru volat nějaké repository, musí být ve startup. Což by teda vysvětlovalo proč mi to fungovalo jen v HomepagePresenter, protože tam jsem ho měl ale v ostatních presenterech ne. A kdybych chtěl v HomegaePresenter volat taky userRespority, musel bych ho v tom startup nechat a ne odstraňovat? nebo se dědí i ten startup?

Děkuji mockrát.

hAssassin napsal(a):

Toto z HomepagePresenteru presun do BasePresenteru:

/** @var \Dochazka\UserRepository */
private $userRepository;

// Metoda startup()
$this->userRepository = $this->context->userRepository;

P.S. Dedeni znamena class HomepagePresenter extends \BasePresenter coz mas OK, ale asi nevis co to je :-)

nanuqcz
Člen | 822
+
0
-

oskarmaniak napsal(a):

<?php
private $userRepository;
?>

Ten $userRepository bych dal určitě protected. Předpokládám, že ho budeš používat i v poděděných presenterech.

Zbytek, jak říká hAssassin.

Editoval nanuqcz (9. 4. 2013 14:54)

hAssassin
Člen | 293
+
0
-

nanuqcz > ano, to mi uniklo…
oskarmaniak > ano, asi mas pravdu, ale prijde mi ze vazne nevis skoro nic o OOP, a bez toho nette budes chapat jen velmi tezko :(

oskarmaniak
Člen | 29
+
0
-

nanuqcz ⇒ Děkuji za typ s Protected, po aplikování mi to píše nějaké chyby, ale to nejspíš že to mám od začátku postavené nějak špatně.

hAssassin⇒ přijde ti to správně, z PHP mám velmi základní znalosti ještě z minulosti.
Takže to doháním za pochodu, což nemusí být zrovna nejlepší. Přesto děkuji za popostrčení a nasměrování na co se v PHP zaměřit. Dík