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

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.

Tomik
Nette Evangelist | 485
+
0
-

Uveď ukázku kódu, který ti toto dělá.

Kaspis
Člen | 13
+
0
-

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
+
0
-

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)

Kaspis
Člen | 13
+
0
-

Děkuji za cenné rady, pomohlo to, vše už běhá jak má. Ještě jednou díky.