Redirect po odoslani formularu (NAbortException)

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

Po odoslani formularu volam funkciu editSite() v ktorej chcem ulozit data z formularu do databazy a nasledne redirectnut na iny view. Pri vykresleni formularu vsak dostanem NAbortException. Nechapem prosim o pomoc.

Funkcia editSite() vyzera nasledovne:

private function editSite($form) {
	$data = $form->getValues();
	dibi::query('UPDATE [site] SET ', $data, 'WHERE [id] = %i', $data->id);
	$this->redirect("Site:default");
}

Ak zakomentujem riadok $this->redirect("Site:default"); Vsetko je OK len ma neredirectne.
Dakujem za pomoc.

Nox
Člen | 378
+
0
-

Nette implementuje redirect pomocí AbortException … nezachytávej jakékoli výjimky, jen ty o které máš zájem/můžeš s nimi něco dělat (asi se to takto má dělat tuším)… pokud fakt není zbytí, tak:

<?php
try{ /*...*/ }
catch(AbortException $e){ throw $e; }
catch(Exception $e){ /* ... */ }
?>

Editoval Nox (21. 7. 2011 0:52)

roarbb
Člen | 29
+
0
-

Takto?

private function editSite($form) {
	try{
		$data = $form->getValues();
		dibi::query('UPDATE [site] SET ', $data, 'WHERE [id] = %i', $data->id);
		$this->redirect("Site:default");
	} catch (Exception $e) {
		$form->addError($e->getMessage());
	}
}

Lebo to tiez nefunguje, aspon uz renderuje stranku s formularom, po odoslani ulozi do db ale neredirectne. Skus konkretnejsie prosim.

Nox
Člen | 378
+
0
-

Netuším jak konkrétněji – doslova jsem psal že Nette používá AbortException* a tudíž ji zachytávat nemáš, ale pokud bys fakt chtěl zachytávat vše (kromě AbortException!), použij konstrukci, kterou jsem napsal.

Neredirectuje se, protože ta AbortException způsobuje redirect, je k tomu určena

*) která je potomkem Exception tudíž catch Exception zachytí i ji!

roarbb
Člen | 29
+
0
-

Tak uz som to vyriesil :)

Ziadne exceptions som nikde nezachytaval naschval, preto to bolo divne. Cely problem bol v tom, ze som formular odosielal pomocou

$form['save']->onClick[] = callback('this', 'editSite');

to bolo zle

Takto je to dobre:

$form->onSuccess[] = array($this, 'editSite');

Dakujem za pomoc.

Editoval roarbb (21. 7. 2011 8:50)