Komponenta formuláře se volá před renderXxx($id)

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

Dobrý den,
mám tento presenter:

use Nette\Application\UI\Form;

class AktualityPresenter extends BasePresenter {
    /** @var \AktualityModel */
    private $model;

    /**
     * @var \Aktualita aktualita
     */
    private $aktualita;

    protected function startup() {
        parent::startup();
        $this->model = $this->context->createAktualityModel();
    }

    /** @var int $id ID aktuality */
    public function renderEdit($id) {
        try {
            $this->aktualita = $this->model->getAktualita($id);
        } catch (\Nette\Application\BadRequestException $e) {
            $this->flashMessage($e->getMessage(), 'chyba');
            $this->redirect('Aktuality:default');
        }
    }

    protected function createComponentAktualitaForm() {
        $form = new Form;
        $form->addText('nadpis', 'Nadpis *')
                ->setRequired('Nadpis je povinná položka.')
                ->addRule(Form::MAX_LENGTH, 'Maximální délka názvu je %d znaků.', 255)
                ->setDefaultValue($this->aktualita->nadpis);
	// ... zkráceno
        $form->addSubmit('save', 'Uložit');

        $form->onSuccess[] = callback($this, 'aktualitaFormSuccess');

        return $form;
    }

Problém je v tom, že po odeslání formuláře se nenaplní $this->aktualita a laděnka vyhazuje chybu Trying to get property of non-object na řádku $form->setDefaultValue($this->aktualita->nadpis);

Byl bych rád, kdybyste mě nakopli správným směrem tak, aby i při druhém vykreslení formuláře byla proměnná naplněná. Díky

Editoval hubipe (2. 4. 2012 14:08)

nanuqcz
Člen | 822
+
0
-

Dobrý den,
handlery (což je v tomto případě i metoda aktualitaFormSuccess()) se volají ještě před „render“ fází. Viz životní cyklus presenteru.

Správná cesta je tedy proměnnou $this->aktualita naplňovat v „action“ fázi, tedy konkrétně v metodě actionEdit()

public function actionEdit($id) {
    try {
        $this->aktualita = $this->model->getAktualita($id);
    } catch (\Nette\Application\BadRequestException $e) {
        $this->flashMessage($e->getMessage(), 'chyba');
        $this->redirect('Aktuality:default');
    }
}
hubipe
Člen | 26
+
0
-

Skvělé, jste moje záchrana. Díky