Přesměrování a opětovné odeslání přes F5

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

Nějak nemohu najit chybu. Mám kontatkní formulář, po validaci a zpracování přesměruji na jinou stránku, ale když dám F5, formulář se znovu odešle. Jak tomu mám zamezit?

URL před vyplněním: http://projekt/kontakt/

URL po vyplnění: http://projekt/…kt/odeslano/?…

<?php
final class Frontend_ContactPresenter extends Frontend_BasePresenter
{
    protected function createComponentForm()
    {
        $form = new Frontend_ContactForm('contactForm');

        // check if form is submitted
        if ($form->isSubmitted()) {
            if (! $form->isValid()) {
                return $form;
            }

            $formData = $form->getValues();

            try {
                Frontend_ContactModel::getInstance()->sendMail($formData);
                $this->flashMessage('Odeslání formululáře proběhlo v pořádku.', 'oki');
            } catch (Exception $e) {
                $this->setView('show');
                $this->flashMessage('Při odesílání kontaktního formuláře došlo k chybě.', 'error');

                return $form;
            }

            $this->redirect(':Frontend:Contact:sended');
        }

        return $form;
    }

    public function renderShow()
    {
        $this->template->pageTitle   .= 'Kontaktní formulář';
        $this->template->header       = 'Kontaktní formulář';
        $this->template->contactForm  = $this->getComponent('form');
    }

    public function renderSended()
    {
        $this->template->pageTitle   .= 'Kontaktní formulář';
        $this->template->header       = 'Odeslání kontaktního formuláře';
    }
}
?>

Editoval hurvajs (4. 9. 2009 9:13)

Ondřej Mirtes
Člen | 1536
+
0
-

Obsluha odeslání formuláře se v továrničce nedělá. Takto se to dělá:

protected function createComponentForm() {
	$form = new Frontend_ContactForm('contactForm');
	$form->onSubmit[] = array($this, 'formSubmitted');
	return $form;
}

public function formSubmitted(AppForm $form) {
        try {
		Frontend_ContactModel::getInstance()->sendMail($form->getValues());
                $this->flashMessage('Odeslání formululáře proběhlo v pořádku.'); //doporučuji si "success" zprávičku přestylovat na class info
                $this->redirect('sended'); //správně anglicky je sent
        } catch (SomeModelExcepion $e) { //výjimka, kterou vyhazuje model
                $form->addError($e->getMessage());
        }
}

Editoval LastHunter (4. 9. 2009 11:34)

hurvajs
Člen | 86
+
0
-

Aha, ja pouzivam jen Form, ne AppForm. Nicmene jsem to rozbehal i s Form. Problem byl v konecnem presmerovani. Kdyz dam jen

<?php
$this->redirect('sent');
?>

tak to jde tak jak ma.

Kdyz tedy pouzivam tovarnicky, tak nemam (nesmim) delat obsluhu primo v ni?

hurvajs
Člen | 86
+
0
-

Nicmene pak nechapu k cemu jen Form, kdyz se maji podle Davida pouzivat tovarnicky a tam mi potom nejde (nebo to neumim) nastaveni obsluhy pro Form.

jasir
Člen | 746
+
0
-

Form je k použití samostatně, mimo Nette Framework. V rámci frameworku (tzn. když používáš prezentery atd) se používá AppForm.

hurvajs
Člen | 86
+
0
-

Jo takhle, aha. To jsem spatne pochopil. Diky moc.

hurvajs
Člen | 86
+
0
-

LastHunter napsal(a):

Obsluha odeslání formuláře se v továrničce nedělá. Takto se to dělá:

A nastaveni default hodnot mohu v tovarnicce mit?

Ondřej Mirtes
Člen | 1536
+
0
-

hurvajs napsal(a):

LastHunter napsal(a):

Obsluha odeslání formuláře se v továrničce nedělá. Takto se to dělá:

A nastaveni default hodnot mohu v tovarnicce mit?

Buďto v action* metodě, např.:

public function actionDefault($id) {
	$defaults = $this['model']->getItem($id);
	$this['form']->setDefaults(array(
		'name' = $defaults->name,
		'text' = $defaults->text,
	));
}

Anebo v továrničce nějak takto:

protected function createComponentForm(AppForm $form) {
	$form = new AppForm($this, 'form'); //setDefaults vyžadují připojení formuláře k presenteru už zde

	//přidávání prvků

	$defaults = $this['model']->getItem($this->getParam('id'));

	$form->setDefaults(array(
		'name' = $defaults->name,
		'text' = $defaults->text,
	));

	//return $form //už není potřeba
}

Editoval LastHunter (4. 9. 2009 12:42)

hurvajs
Člen | 86
+
0
-

action metode to nejde, protoze v momente, kdy to do ni skoci, tak jeste neni znamy formular. Takze asi jen pres tu tovarnicku.

jasir
Člen | 746
+
0
-

hurvajs napsal(a):

action metode to nejde, protoze v momente, kdy to do ni skoci, tak jeste neni znamy formular. Takze asi jen pres tu tovarnicku.

Ale jde. Tím, že voláš $this['form'], se automaticky komponenta (AppForm) přes továrničku vytvoří. Přístup $this['form'] je vlastně zkráceně $this->getComponent('form'). Metoda getComponent(), pokud nenalezne komponentu form, se pokusí zavolat createComponentForm('form').

Editoval jasir (4. 9. 2009 13:25)

hurvajs
Člen | 86
+
0
-

jasir napsal(a):

Ale jde. Tím, že voláš $this['form'], se automaticky komponenta (AppForm) přes továrničku vytvoří…

Bingo. Jde to, mas pravdu. Dnes jsem nejaky natvrdly… :-(
Osobne pouzivam spise $this->getComponent('something') nez $this['something']. Nedocvaklo mi to.

Moc dekuji.

David Grudl
Nette Core | 8105
+
0
-

Není nastavení výchozích hodnot lepší mít v render- metodě?