Přesměrování v onSuccess vyhodí AbortException

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

Zdravím,

prolezl jsem několik diskuzí a hledal odpověď na tuto chybu, ale bohužel jsem na nic nenarazil.

Mám factory pro nahrávání souborů do galerie:

class GalleryUploadForm extends FileUploadForm{
	...
	public function createComponentForm(){
		$form = new Form();

		$form->addMultiUpload('files');

		$form->addSubmit('upload', 'Nahrát')
				->setAttribute('class', 'btn btn-lg btn-success');

		$form->onSuccess[] = [$this, 'formSucceed'];

		return $form;
	}

	public function formSucceed(Form $form){
		try{
			$values = $form->getValues();

			$files = $values->files;

			$this->attachFilesToEntity($files);

			$this->onSuccess($form);

		}catch(\Exception $e){
			$this->onError($form);
		}
	}
	...
}

V presenteru ji injectuji a následně vytvářím componentu:

class GalleryPresenter extends BasePresenter{
	/** @var IGalleryUploadFactory @inject */
	public $filesUploadFactory;

	public function createComponentFotosForm(){
		$control = $this->filesUploadFactory->create($this->galleryToEdit);


		$control->onSuccess[] = function($control) {
			$this->flashMessage('Soubory byly úspěšně nahrány', 'success');
			$this->redirect('this');
		};

		return $control;
	}
}

Jenže jakmile nahraju soubory a provede se přesměrování, tak to vyhodí AbortException. Je zvláštní, že stejným způsobem na té samé stránce mám formulář pro ukládání nějakých základních informací o galerii a vše se provede v pořádku bez jakýchkoliv výjimek. Dočetl jsem se, že tam je chyba v opožděném přiřazení události, ale nejde mi do hlavy, proč to jednou funguje a podruhé ne.

Díky za pomoc.

Aurielle
Člen | 1281
+
+2
-

AbortException je interní výjimka Nette, která se vyhazuje právě při redirectu. Buď si uprav catch klauzuli tak, aby chytala ne všechny Exception, nebo AbortException znovu vyhoď, nějak takhle:

...
} catch (\Exception $e) {
	if ($e instanceof AbortException) {
		throw $e;
	}

	$this->onError($form);
}
David Grudl
Nette Core | 8228
+
0
-

Je to i v dokumentaci.

Oli
Člen | 1215
+
+1
-

Další možností je šáhnout na tu komponentu dřív než v šabloně. Předpokládám, že ten formulář kterej ti funguje nastavuješ i nějak jako $this['form']->setSomething() v action metodě. Proto se ta komponenta vytvoří včas a redirect se provede. Pokud na ni nešáhneš, tak se ti vytvoří až v šabloně a to už je pozdě. Uplně stačí dát do action/render metody $this['fotosForm'];

serten
Člen | 55
+
0
-

@Aurielle Díky, to pomohlo

@DavidGrudl Můžu se zeptat kde v dokumentaci? Nebo která část?

@Oli Díky, na tohle jsem jaksi zapomněl, že se to dá taky použít. Taky funguje dobře.

David Matějka
Moderator | 6445
+
+3
-

@DavidGrudl Můžu se zeptat kde v dokumentaci? Nebo která část?

https://doc.nette.org/…n/presenters#…

Přesměrování okamžitě ukončí činnost presenteru vyhozením tzv. ukončovací výjimky Nette\Application\AbortException.

serten
Člen | 55
+
0
-

Super, díky za pomoc.