Call to a member function infoUser() on a non-object
- oskarmaniak
- Člen | 29
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
Napadají mě dvě možné příčiny:
TvůjHomepagePresenter
nedědí zBasePresenter
.VHomepagePresenter
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)
- oskarmaniak
- Člen | 29
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
<?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:
TvůjHomepagePresenter
nedědí zBasePresenter
.VHomepagePresenter
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
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
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 doBasePresenteru
:/** @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
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