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