Jak dostat data přihlášeného uživatele?
- lumitron
- Člen | 4
Ahoj, začal jsem s Nette asi tak… předevčírem. Nějaké základní znalosti mám, ale i tak furt občas netuším. Vytvořil jsem si jednoduchý „blog“ podle QuickStartu a začal jsem si ho trošku ladit. Když mám přihlášeného uživatele (tahám z DB), tak bych potřeboval u příspěvku testovat, jestli je tu přihlášený uživatel a pokud ano, skryji input u formuláře jméno a mail a nahradím to hidden, kam nacpu hodnotu od uživatele, aby to nemusel vyplňovat, když je přihlášený, oproti guestovi, který bez loginu bude muset tohle vyplnit.
Kus PostPresenteru:
<?php
namespace App\Presenters;
use Nette,
Nette\Application\UI\Form;
class PostPresenter extends BasePresenter
{
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderShow($postId)
{
$post = $this->database->table('posts')->get($postId);
if (!$post) {
$this->error('Stránka nebyla nalezena');
}
$this->template->post = $post;
$this->template->comments = $post->related('comment')->order('created_at');
}
protected function createComponentCommentForm()
{
$form = new Form;
$form->addText('name', 'Jméno:')
->setRequired();
$form->addText('email', 'Email:');
$form->addTextArea('content', 'Komentář:')
->setRequired();
$form->addSubmit('send', 'Publikovat komentář');
$form->onSuccess[] = [$this, 'commentFormSucceeded'];
return $form;
}
...
?>
Co bych potřeboval:
<?php
...
protected function createComponentCommentForm()
{
$form = new Form;
if ( #uživatel je přihlášen ) {
$form->addHidden('name', 'Jméno:')
->setValue( #username);
$form->addHidden('email', 'Email:')
->setValue( #email);
} else {
$form->addText('name', 'Jméno:')
->setRequired();
$form->addText('email', 'Email:');
}
$form->addTextArea('content', 'Komentář:')
->setRequired();
$form->addSubmit('send', 'Publikovat komentář');
$form->onSuccess[] = [$this, 'commentFormSucceeded'];
return $form;
}
...
?>
Předem děkuji za odpověď a omlouvám se, pokud je to nějaká banalita, ale mě to prostě občas neleze do hlavy a vše co jsem našel mi nefungovalo (očividně díky mé blbosti a nechápavosti).
- David Matějka
- Moderator | 6445
$this->getUser()
ti vrati Nette\Security\User
,
vice v doc https://doc.nette.org/…thentication
- lumitron
- Člen | 4
<?php
namespace App\Presenters;
use Nette,
App\Model\ArticleManager;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/** @var ArticleManager */
private $articleManager;
/** @var Nette\Security\User */
private $user;
public function __construct(ArticleManager $articleManager)
{
$this->articleManager = $articleManager;
if($this->getUser()){
$this->user = $this->getUser();
print_r($this->user->getIdentity()->email);
if ($this->user->isLoggedIn())
{
print_r("Jsem přihlášený!");
} else
{
print_r("Nejsem přihlášený!");
}
}
}
public function renderDefault()
{
$this->template->posts = $this->articleManager->getPublicArticles()->limit(5);
}
}
Vyhodí chybu „Service User has not been set.“. Už nevím, zkouším to různě, ale nic. Tutoriály jsou dobré, ale lepší by bylo, kdyby u každého byl soubor s funkčním příkladem, který bych si mohl prolézt a „osahat“, jelikož jinak mi to dělá problém pochopit. :/
- abc
- Člen | 92
- zkus to někde dál, v __constructu to ještě nebude nastavené, ve startup už by to mělo být ok (viz https://doc.nette.org/…n/presenters#…)
→ __construct používej pouze pro injectování služeb
- identity je imho nastavená, až když jsi přihlášen (nemůžeš dumpnout identity->email, když nevíš, zda je uživatel přihlášen)
- lumitron
- Člen | 4
<?php
namespace App\Presenters;
use Nette,
App\Model\ArticleManager;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
/** @var ArticleManager */
private $articleManager;
/** @var Nette\Security\User */
private $user;
public function __construct(ArticleManager $articleManager)
{
$this->articleManager = $articleManager;
}
public function startup()
{
if($this->getUser()){
$this->user = $this->getUser();
print_r($this->user->getIdentity()->email);
if ($this->user->isLoggedIn())
{
print_r("Heyaaaaa!");
} else
{
print_r("Ghuaaaa!");
}
}
}
public function renderDefault()
{
$this->template->posts = $this->articleManager->getPublicArticles()->limit(5);
}
}
?>
Když to hodím do startupu, tak to hlásí:
Nette\InvalidStateException
Method App\Presenters\HomepagePresenter::startup() or its descendant doesn't
call parent::startup().
- abc
- Člen | 92
A ještě property $user není v presenteru třeba, má jí jejích předek
https://api.nette.org/…ter.php.html#118
Volej jen $this->getUser() (případně $this->user)