Přesměrování v onSuccess vyhodí AbortException
- serten
- Člen | 55
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
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);
}
- Oli
- Člen | 1215
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'];
- David Matějka
- Moderator | 6445
@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.