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

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

$this->getUser() ti vrati Nette\Security\User, vice v doc https://doc.nette.org/…thentication

lumitron
Člen | 4
+
0
-
<?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
+
0
-
  1. 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

  1. 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
+
0
-
<?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().

lumitron
Člen | 4
+
0
-

V pohodě, trošku jsem zapomněl, že jsem ve startupu nevolal předka. Dobrý, už to vypadá, že to funguje. Takže veškeré tyhle testovací blbůstky raději do startupu, než do konstruktoru, jelikož ve startupu je už plně načteno, či tak nějak?

chemix
Nette Core | 1310
+
0
-

Mrkni na pojem životnost presenteru. Tam je popsano co je kdy připravené k používá a co kde používat

abc
Člen | 92
+
+2
-

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)