Výpis informací o uživateli – zjištění ID přihlášeného uživatele
- vcelka.maja
- Člen | 8
Ahojte,
s Nette teprve začínám, potřebovala bych poradit. Potřebuji aby byl
uživateli k dispozici výpis o jeho údajích a nevím jak na to. Poradí
mi někdo?
Toto mám v Presenteru:
namespace App\Presenters;
use Nette;
class UserPresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context*/
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderUser(): void
{
$uzivatele = $this->database->query('SELECT * FROM uzivatele u')->fetchAll();
$this->template->uzivatele = $uzivatele;
$userID = $this->user->getId();
}
}
A toto v šabloně:
{block content}
<div class="uzivatel">
<h3>Uživatel</h3>
{*foreach $uzivatele as $uzivatel}{/foreach*}
{foreach $uzivatele as $uzivatel}
{if $userID == $uzivatel->ID }
<h1 n:block=title>{$uzivatel->username}</h1>
<span>{$uzivatel->titul}</span>
<span>{$uzivatel->jmeno}</span>
<span>{$uzivatel->prijmeni}</span>
{/if}
{/foreach}
</div>
{/block}
Editoval vcelka.maja (31. 5. 2019 9:23)
- kalatalabnik
- Člen | 35
Předně nepotřebuješ natahovat všechny uživatele, rovnou si vytáhni jenom toho, který tě zajímá, nějak takto:
<?php
...
$uzivatel = $this->database->query('SELECT * FROM uzivatele u WHERE u.ID = ?', $this->user->getId())->fetch();
$this->template->uzivatel = $uzivatel;
...
?>
A v šabloně pak nějak takto:
<?php
{block content}
<div class="uzivatel">
<h3>Uživatel</h3>
<h1 n:block=title>{$uzivatel->username}</h1>
<span>{$uzivatel->titul}</span>
<span>{$uzivatel->jmeno}</span>
<span>{$uzivatel->prijmeni}</span>
</div>
{/block}
?>
Píšu to z hlavy, tak je možné, že jsem se úplně netrefil.
- Mysteria
- Člen | 797
Proč vytahuješ všechny uživatele a procházíš je v šabloně foreachem místo toho, aby jsi rovnou vytáhla toho správného?
$this->template->uzivatel = $this->database->query('SELECT * FROM uzivatele WHERE id = ?;', $this->user->getId())->fetch();
<h1 n:block=title>{$uzivatel->username}</h1>
{block content}
<div class="uzivatel">
<h3>Uživatel</h3>
<span>{$uzivatel->titul}</span>
<span>{$uzivatel->jmeno}</span>
<span>{$uzivatel->prijmeni}</span>
</div>
{/block}
- vcelka.maja
- Člen | 8
kalatalabnik napsal(a):
Předně nepotřebuješ natahovat všechny uživatele, rovnou si vytáhni jenom toho, který tě zajímá, nějak takto:
<?php ... $uzivatel = $this->database->query('SELECT * FROM uzivatele u WHERE u.ID = ?', $this->user->getId())->fetch(); $this->template->uzivatel = $uzivatel; ... ?>
A v šabloně pak nějak takto:
<?php {block content} <div class="uzivatel"> <h3>Uživatel</h3> <h1 n:block=title>{$uzivatel->username}</h1> <span>{$uzivatel->titul}</span> <span>{$uzivatel->jmeno}</span> <span>{$uzivatel->prijmeni}</span> </div> {/block} ?>
Píšu to z hlavy, tak je možné, že jsem se úplně netrefil.
Děkuji, ale vyhodilo mi to Trying to get property of non-object
- vcelka.maja
- Člen | 8
Mysteria napsal(a):
Proč vytahuješ všechny uživatele a procházíš je v šabloně foreachem místo toho, aby jsi rovnou vytáhla toho správného?
$this->template->uzivatel = $this->database->query('SELECT * FROM uzivatele WHERE id = ?;', $this->user->getId())->fetch();
<h1 n:block=title>{$uzivatel->username}</h1> {block content} <div class="uzivatel"> <h3>Uživatel</h3> <span>{$uzivatel->titul}</span> <span>{$uzivatel->jmeno}</span> <span>{$uzivatel->prijmeni}</span> </div> {/block}
Moc děkuji, ale pořád mi to vyhazuje chybu.
- Pavel Kravčík
- Člen | 1196
A je uživatel přihlášený a vrací
$this->getUser()->getId()
nějakou hodnotu?
- vcelka.maja
- Člen | 8
Mysteria napsal(a):
Tak v tom případě pravděpodobně nebyl nalezen uživatel v databázi. Co ti vypíše
bdump($uzivatel)
?
presenter = Homepage
action = default
id = null
User:user
id = null
Editoval vcelka.maja (31. 5. 2019 10:07)
- vcelka.maja
- Člen | 8
Pavel Kravčík napsal(a):
A je uživatel přihlášený a vrací
$this->getUser()->getId()
nějakou hodnotu?
Ano, je přihlášený, ale $this->getUser()->getId()
vrací User:user
id = null
Editoval vcelka.maja (31. 5. 2019 10:07)
- vcelka.maja
- Člen | 8
MajklNajt napsal(a):
@vcelkamaja ukáž ešte ako užívateľa prihlasuješ…
Nette\Security\User::getID()
sa snaží vytiahnuť ID z identity, ak sa identita nesetuje, nemá sa čo vrátiť
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
use Model\UserManager\UserManager;
class SignPresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context*/
private $database;
/** @var Model\UserManager*/
private $userManager;
public function __construct(Nette\Database\Context $database,
UserManager $userManager){
$this->database = $database;
$this->userManager = $userManager;
}
protected function createComponentSignInForm(): Form
{
$form = new Form;
$form->addText('username', 'Uživatelské jméno:')
->setRequired('Vyplňte své uživatelské jméno.');
$form->addPassword('password', 'Heslo:')
->setRequired('Vyplňte své heslo.');
$form->addSubmit('send', 'Přihlásit se');
$form->onSuccess[] = [$this, 'signInFormSucceeded'];
return $form;
}
public function signInFormSucceeded(Form $form, \stdClass $values): void
{
try
{
$this->getUser()->login($values->username, $values->password);
$this->redirect('Homepage:');
}
catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné přihlašovací jméno nebo heslo.');
}
}
public function actionOut(): void
{
$this->getUser()->logout();
$this->flashMessage('Odhlášení bylo úspěšné.');
$this->redirect('Homepage:');
}
}
- vcelka.maja
- Člen | 8
MajklNajt napsal(a):
a
UserManager
je ten zo sandboxu (implementujeNette\Security\IAuthenticator
)? a určite ti$this->getUser()->isLoggedIn()
vraciatrue
?
namespace Model\UserManager;
use Nette;
use Nette\Security\AuthenticationException;
class UserManager implements Nette\Security\IAuthenticator{
/** @var Nette\Database\Context*/
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function authenticate(array $credentials): \Nette\Security\IIdentity {
\Tracy\Debugger::barDump($credentials, '$credentials');
try{
$uzivatel = $this->database->query
('SELECT u.username as username, u.password as password FROM uzivatele u
WHERE u.username = ? AND u.password = ?',
//$credentials['username'], $credentials['password'])->fetch();
$credentials[0], $credentials[1])->fetch();
if(!$uzivatel){
throw new AuthenticationException('Uživatel nebyl nalezen.', self::IDENTITY_NOT_FOUND);
}
return new Nette\Security\Identity($uzivatel->username, $uzivatel->password);
//return new Nette\Security\Identity(); TODO
}
catch (Nette\Security\AuthenticationException $e) {
throw new Nette\Security\AuthenticationException('Chyba', self::IDENTITY_NOT_FOUND);
}
}
public function registruj($values){
\Tracy\Debugger::barDump($values, '$values');
$this->database->query('INSERT INTO uzivatele', [
'titul' => $values->titul,
'jmeno' => $values->jmeno,
'prijmeni' => $values->prijmeni,
'username' => $values->username,
'password' => $values->password,
]);
}
}
- MajklNajt
- Člen | 502
a tu je problém:
return new Nette\Security\Identity($uzivatel->username, $uzivatel->password);
musíš opraviť takto:
return new Nette\Security\Identity($id, $roles, [$uzivatel->username, ...]);
EDIT: to $id
a $roles
samozrejme vytiahnuť
z DB
Editoval MajklNajt (31. 5. 2019 10:55)
- vcelka.maja
- Člen | 8
MajklNajt napsal(a):
a tu je problém:
return new Nette\Security\Identity($uzivatel->username, $uzivatel->password);
musíš opraviť takto:
return new Nette\Security\Identity($id, $roles, [$uzivatel->username, ...]);
EDIT: to
$id
a$roles
samozrejme vytiahnuť z DB
Moc děkuji! :)
- 2bad2furious
- Člen | 26
Já jenom dodám, ze by se to heslo mělo nashovat. Pak si akorát musíš upravit sql na tahání jenom podle username a heslo ověřovat proti hashi.