Redirect formulára v prezenteri

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

Zdravím všetkých,
postupoval som podľa tohto návodu pre vytvorenie formulára ako komponentu a následné presmerovanie cez Presenter na detail.

Component:

public $onFormSave;

protected function createComponentForm()
    {
        $form = new Form();
        /* ... vytvorenie samotného formu */
        $form->onSuccess[] = callback($this, 'formSubmitted');
        return $form;
    }

	public function formSubmitted(Form $form)
    {
            $object = new \Object();
			/* ... vytvorenie a ulozenie objektu */
            $this->onFormSave($form, $object);
    }

Presenter:

protected function createComponentFormComponent()
    {
        $component = $this->formComponentFactory->create();
        $component->onFormSave[] = function($form, $object) {
            if (!$form->hasErrors()) {
                $this->redirect(':App:Homepage:detail', array('id' => $object->id));
            }
        };
        return $component;
    }

V Presenteri som kontroloval objekt a vracia svoje ID. Formulár sa odošle, objekt sa uloží, zavolá sa aj onFormSave inicializovaná v Presenteri, no $this->redirect(‚…‘) je mŕtve.

Oli
Člen | 1215
+
+1
-

Nepoužíváš náhodou verzi PHP 5.3?

To by pak muselo být

$these = $this;
$component->onFormSave[] = function($form, $object) use ($these) {
// ...
orech
Člen | 40
+
0
-

Nie, používam PHP Version 5.5.9. Ale skúšal som to už aj hentak, no výsledok je totožný.

David Kudera
Člen | 455
+
+1
-

nemáš to třeba obalené celé v try catch, který chytá Exception?

Jinak osobně mám spíš nějaký onFormSuccess, abych nemusel v presenteru testovat jestli nemá form chyby.. A vlastně form nepředávám potom do takové události vůbec, jen tu novou entitu.

Editoval David Kudera (16. 7. 2015 12:15)

orech
Člen | 40
+
0
-

Áno, mám to v try-catch. Chyby formu chcem odchytiť na úrovni komponentu a od Presentera chcem už len presmerovanie. To hasErrors je tam kvôli tomu, že mi to aj po výnimke presmerovalo.

Editoval orech (16. 7. 2015 13:49)

David Matějka
Moderator | 6445
+
+1
-
  1. nette redirect vyvolava AbortException, tak proto ti to nefunguje
  2. (skoro) nikdy nechytej vsechny vyjimky – chytej pouze ty, ktere vis, ze mohou nastat, a umis je spravne osetrit
orech
Člen | 40
+
0
-

@DavidMatějka Díky moc! Odchytávam už len InvalidArgumentException a všetko ide.

David Matějka
Moderator | 6445
+
+1
-

@orech InvalidArgumentException je zrovna ten druh chyby, ktery bys mel odchytavat minimalne – jedna se o potomka LogicException, ktere rikaji, ze neco spatne pouzivas.. vice v prednasce Honzy Tvrdika https://www.youtube.com/watch?…