Trying to get property of non-object

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

Logovani na stranky jsem si napsal primo do BasePresenteru:

<?php
$user = NEnvironment::getUser();
$this->uzivatel = $this->template->user = $user->isLoggedIn() ? $user->getIdentity() : NULL;
?>

Vsechny ostatni Presentery dedim z BasePresenteru. Pokud si v nejakym z techto prezenteru necham vypsat uzovatelovo id

<?php
echo $this->uzivatel->id;
?>

tak se hezky vypise. Problem je v tom, kdyz chci toto id priradit do nejake promenne:

<?php
$promenna = $this->uzivatel->id;
?>

vypise to hlasku:

Notice: Trying to get property of non-object in NejakyPresenter on line 25

Napadlo me ID po nalogovani ulozit do session a pracovat pak s ni, ale kdyz uz je implementovany ono getIdentity() do $uzivatele, uplne by stacilo tahat to id odtam.
Diky za radu.

Jan Tvrdík
Nette guru | 2595
+
0
-

$this->uzivatel->id nemůžeš nikdy použít, protože $this->uzivatel může být NULL. Správně je např. $this->uzivatel ? $this->uzivatel->id : NULL.

Operanda
Člen | 20
+
0
-

Jiste, zkousel jsem to samozrejme nalogovanej. Tu podminku bych tam pak pridal, kdyby to bylo funkcni, ale nerozimim tomu, proc se id vypise, ale pri prirazeni to takhle pada…

Jan Tvrdík
Nette guru | 2595
+
0
-

V $this->uzivatel je NULL. Důvody si dohledej ve své aplikaci.

Operanda
Člen | 20
+
0
-

Tomu nerozumim. Pokud by $this->uzivatel bylo opravdu NULL, nevypsalo by $this->uzivatel->id ID uzivatele, ne? Jenze ono to ID vypise.

Jan Tvrdík
Nette guru | 2595
+
0
-

Asi to máš na různých místech kódu bez další závislosti.

Operanda
Člen | 20
+
0
-

Mam pouze BasePresenter:

<?php
abstract class BasePresenter extends NPresenter
{
	public $oldLayoutMode = FALSE;
	protected $uzivatel;

	protected function beforeRender()
	{
		$user = NEnvironment::getUser();
		$this->uzivatel = $this->template->user = $user->isLoggedIn() ? $user->getIdentity() : NULL;
	}
?>

a:

<?php
final class JinyPresenter extends BasePresenter
{
public function createComponentJizdaForm() {
      $form = new NAppForm;
      $form->addHidden('id', $this->uzivatel->id);
      ...
}
?>

nedela to jen v tomto formularovem prirazeni, ale take v obycejnem $promenna = $this->uzivatel->id;

Jan Tvrdík
Nette guru | 2595
+
0
-

Kdybys poctivě studoval dokumentaci, tak bys věděl, že beforeRender se vyhodnocuje až po zpracování signálů (tj. po zavolání createComponentJizdaForm). Tudíž v době, kdy se volá createComponentJizdaForm, tak $this->uzivatel je ještě NULL.

Operanda
Člen | 20
+
0
-

Jak se v presenteru (popripade modelu) dostat k datum nalogovaneho uzivatele z getIdentity?

(zbytek jsem omylem smazal)

Editoval Jan Tvrdík (9. 2. 2011 20:14)

Jan Tvrdík
Nette guru | 2595
+
0
-

Jak se v presenteru (popripade modelu) dostat k datum nalogovaneho uzivatele z getIdentity?

$this->getUser()->getIdentity()->getData();

(https://api.nette.org/…dentity.html)