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
 
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
 
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');
        }
    }