Po submite formulara sa znovu vola createComponentXXX s hlaskou: 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.
siami
Člen | 3
+
0
-

PHP 5.4.3 | Server Apache/2.4.2 (Win64) PHP/5.4.3 | Nette Framework 2.0.5

Po submite formulara sa znovu vola createComponentXXX s hlaskou: Trying to get property of non-object
Chybova hlaska odkazuje na riadok: ‚$tmp = $uziv->name;‘ v metode createComponent.
Viete poradit? Preco sa znova vola tato metoda?

<?php
/**
 * Presenter,
 */

use Nette\Database\Connection;
use Nette\Forms;
use Nette\Application\UI\Form;

class UzivEditPresenter extends BasePresenter
{
    private $repNast;
    private $idUziv;

    protected function startup()
    {
        parent::startup();
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }
        //authenticate - len admin - 1
        if ($this->getUser()->getRoles()[0] != "admin")
            $this->redirect('Homepage:');

        $this->repNast = $this->context->nastaveniaRepository;
    }
    public function renderDefault($idUziv)
    {
        $this->idUziv = $idUziv;
    }

    protected function createComponentUzivEditForm()
    {
        $uziv = $this->repNast->Uzivatelia_getUser($this->idUziv);
        $kateg = $this->repNast->Uzivatelia_getKateg()->fetchPairs('IdUzivKateg', 'MenoUzivKateg');

        $tmp = $uziv->name;

        $form = new Form();
        $form->addText('tbMeno', 'Meno a priezvisko používateľa:', 20, 50)
            ->addRule(Form::FILLED, 'Je nutné zadať názov.')
            ->setDefaultValue($uziv->name);
        $form->addSelect('cbKateg', 'Kategória:', $kateg)
            ->setPrompt('Zvoľte kategóriu')
            ->addRule(Form::FILLED, 'Je nutné vybrať, kategóriu.')
            ->setDefaultValue($uziv->XidUzivKateg);
        $form->addText('tbUzivMeno', 'Používateľské meno:', 20, 50)
            ->addRule(Form::FILLED, 'Je nutné zadať názov.')
            ->setDefaultValue($uziv->username);

        $form->addSubmit('btUlozit', 'Uložiť');
        $form->addSubmit('btStorno', 'Zrušiť')
            ->setValidationScope(FALSE);

        $form->onSuccess[] = $this->UzivEditFormSubmitted;
        //$form->onSuccess[] = callback($this, 'taskFormSubmitted')    - stara verzia
        return $form;
    }

    //vola sa po uspesnom odoslani dat formulara
    public function UzivEditFormSubmitted(Form $form)
    {
        //$this->repNast->MO_setNazov(1, $form->values->tbNazov);
        $this->flashMessage('Zmena zapísaná.', 'success');
        $this->redirect('dede:');
    }

}

?>
enumag
Člen | 2118
+
0
-

Metoda $this->repNast->Uzivatelia_getUser($this->idUziv); z nějakého důvodu nevrací objekt.

voda
Člen | 561
+
0
-

Metodu renderDefault přejmenuj na actionDefault.

siami
Člen | 3
+
0
-

voda napsal(a):

Metodu renderDefault přejmenuj na actionDefault.

OK, funguje to, dik.
Ale vies to trochu vyvsetlit? Aka je postupnost volania funckii po stlaceni tlacitka ulozit? Vdaka za odpoved.

enumag
Člen | 2118
+
0
-

To je jedna z nejdůležitějších věcí, co bys měl vědět o Nette, jde o životní cyklus presenteru.

V tvém případě šlo o to, že signál odeslání formuláře se zpracoval dříve než metoda renderDefault a property $this->idUziv při volání createComponentUzivEditForm ještě nebyla inicializována.

siami
Člen | 3
+
0
-

enumag napsal(a):

To je jedna z nejdůležitějších věcí, co bys měl vědět o Nette, jde o životní cyklus presenteru.

V tvém případě šlo o to, že signál odeslání formuláře se zpracoval dříve než metoda renderDefault a property $this->idUziv při volání createComponentUzivEditForm ještě nebyla inicializována.

Vsimol som si ten krasny obrazok. Podla tohto obrazku vsak, sablona sa spracovava az po ‚render<View>‘ a az tam sa prvykrat pouziva ‚UzivEditForm‘ (az teraz sa ma zavolat metoda ‚createComponentUzivEditForm()‘). Uvazujem spravne?

enumag
Člen | 2118
+
0
-

Šablona ano, ale signál odeslání formuláře se zpracovává ve fázi handle, což je dříve než render. Továrna se totiž volá při prvním použití dané komponenty, což v tomto případě je zpracování signálu submit.