redirect a AppForm
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Kaspis
- Člen | 13
Zdravím, nedaří se mi přesměrovat po submitu formuláře resp. (->onClick…). Hledal jsem tady na fóru a nenašel. Jinak ten AppForm mam udělanej stejně jako v příkladu tady v dokumentaci. Kód který je v obslužné metodě toho tlačítka v pořádku proběhne, ale redirect prostě ne. Stránka s formulářem se „obnoví“ s novými daty.
Ještě jsem si všiml, že ve flashmessages se objeví prázdná zpráva typu error.
Nesetkal se někdo s takovou chybkou? Předem díky za pomoc.
- Kaspis
- Člen | 13
presenter:
...
//render
public function renderEditPolozku($id){
$this->template->form = $this['editPolozkyVMenuForm'];
$this->setView('edit');
}
...
// komponenta
protected function createComponentEditPolozkyVMenuForm(){
$data = $this->dataSource->getRow('menu', $this->getParam('id'), 1);
$form = new AppForm();
$form->addGroup($data->name);
$form->addText('name', 'Název menu: ');
$form->addSelect('location', 'Umístění: ', $this->locations);
$form->addMultiSelect('articles', 'Přiřazené články: ',
$this->dataSource->getArticles());
...
$form->addSubmit('save', 'Uložit')->onClick[] = array($this,'updatepolozkyvmenuClicked');
$form->setDefaults($data);
return $form;
}
// onClick metoda
public function updatepolozkyvmenuClicked(SubmitButton $button){
try{
$values = $button->getForm()->getValues();
$this->flashMessage($this->dataSource->setRowNLink('menu', 'articles', $values, $values['id'], 1), 'succes');
$this->redirect('polozkyVMenu'); //renderPolozkyVMenu existuje ve stejnem presenteru
}
catch(Exception $e){
$this->flashMessage($e->getMessage(), 'error');
}
}
Sablona
{extends "../includes/adminLayout.phtml"}
{block #frameContent}
{? echo $form}
- Ondřej Mirtes
- Člen | 1536
Pár doporučených úprav:
//render
public function renderEditPolozku($id){
//$this->template->form = $this['editPolozkyVMenuForm']; //není potřeba, vykreslíme ho přes widget
//$this->setView('edit'); //zde je to na nic, setView se musí provádět v action*
}
...
// komponenta
protected function createComponentEditPolozkyVMenuForm(){
$data = $this->dataSource->getRow('menu', $this->getParam('id'), 1);
$form = new AppForm();
$form->addGroup($data->name);
$form->addText('name', 'Název menu: ');
$form->addSelect('location', 'Umístění: ', $this->locations);
$form->addMultiSelect('articles', 'Přiřazené články: ',
$this->dataSource->getArticles());
...
$form->addSubmit('save', 'Uložit');
//pokud odesíláš form a nepotřebuješ zjistit, přes které tlačítko, je lepší pole onSubmit
$form->onSubmit[] = array($this, 'formSubmitted');
$form->setDefaults($data);
return $form;
}
public function formSubmitted(AppForm $form){
try{
$values = $form()->getValues();
$this->flashMessage($this->dataSource->setRowNLink('menu', 'articles', $values, $values['id'], 1)); //pokud neudáš typ zprávičky, dá se class info, tak by s tím tvoje CSS mělo počítat
$this->redirect('polozkyVMenu'); //renderPolozkyVMenu existuje ve stejnem presenteru
}
catch(IOException $e){ //musíš odchytávat konkrétní výjimku, Exception ti odchytí i výjimku, kterou vyvolává redirect a přesměrování se neprovede
$this->flashMessage($e->getMessage(), 'error');
}
}
Šablona:
{extends "../includes/adminLayout.phtml"}
{block #frameContent}
{control editPolozkyVMenuForm}
Editoval Ondřej Mirtes (18. 11. 2009 9:50)