spouštění createComponent

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

Zdravím,
chtěl bych se zeptat, proč se metoda createComponentMyForm spouští jak při renderování formuláře myForm, tak při klinutí na submit tlačítko.
Dále bych se chtěl zeptat, proč se při tomto druhém zavolání z presenteru vytratí všechny property, které jsem si tam předtím uložil.

Konkrétně:
mám soubor edit.latte:
{block content}

{control changePublicProfileForm}

{/block}

a v presenteru mám metody:

<?php
    public function renderEdit($id) {
        $this->id = $id;
    }

    protected function createComponentChangePublicProfileForm() {
        if (!($this->getUser()->isAllowed(AuthorizationHandler::EDIT_PROFILE_SETTINGS)) {
            throw new AuthenticationException("You can not edit public profile of user with id ".$this->id);
        }
        $user = $this->userHandler->getUserWithId($this->id);
        $form = $this->formFactory->createChangePublicProfileForm($user);
        $form->onSuccess[] = $this->changePublicProfileFormSucceeded;
        return $form;
    }

    public function changePublicProfileFormSucceeded($form) {
	//uložení dat z formuláře do databáze
    }
?>

a mám problém v tom, že když vyplním formulář a kliknu na submit, tak se zavolá metoda createComponentChangePublicProfileForm a hlásí, že $this->id == null.

Nevíte, proč se to tak děje či jak se s tím vypořádat?

Děkuji za odpovědi.

David Matějka
Moderator | 6445
+
+4
-

viz zivotni cyklus presenteru (zpracovani formulare jsou zpracovani signalu – neboli handle metody)
render je tedy pozde, musis v action

Editoval matej21 (28. 8. 2014 13:07)

Azathoth
Člen | 495
+
0
-

Aha, děkuji. Ta informace, že zpracování formuláře jsou handle metody, mi chyběla.

Azathoth
Člen | 495
+
0
-

Počkat, ale to nevysvětluje fakt, že když vykreslím formulář poprvé, tak to všechno funguje. Protože jestli se formulář vždy zpracovává dříve než render, tak by to mělo spadnou už při prvním vykreslení formuláře, ne?

David Matějka
Moderator | 6445
+
+4
-

nn, pri vykreslovani nedochazi ke zpracovani. createComponent* metoda se vola, az kdyz je ta komponenta (formular) potreba. V pripade vykreslovani je potreba az v sablone. Po odeslani dochazi k jeho zpracovani a proto je ho potreba vytvorit drive (tedy na stejne urovni jako ty handle* metody)

Editoval matej21 (28. 8. 2014 13:24)