Výpis informací o uživateli – zjištění ID přihlášeného uživatele

vcelka.maja
Člen | 8
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 | 1180
+
0
-

A je uživatel přihlášený a vrací $this->getUser()->getId() nějakou hodnotu?

Mysteria
Člen | 797
+
0
-

Tak v tom případě pravděpodobně nebyl nalezen uživatel v databázi. Co ti vypíše bdump($uzivatel)?

vcelka.maja
Člen | 8
+
0
-

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
+
0
-

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)

MajklNajt
Člen | 471
+
0
-

@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ť

vcelka.maja
Člen | 8
+
0
-

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:');
    }
}
MajklNajt
Člen | 471
+
0
-

a UserManager je ten zo sandboxu (implementuje Nette\Security\IAuthenticator)? a určite ti $this->getUser()->isLoggedIn() vracia true?

vcelka.maja
Člen | 8
+
0
-

MajklNajt napsal(a):

a UserManager je ten zo sandboxu (implementuje Nette\Security\IAuthenticator)? a určite ti $this->getUser()->isLoggedIn() vracia true?

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 | 471
+
+1
-

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
+
+1
-

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
+
+1
-

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.