Přesměrování a opětovné odeslání přes F5
- hurvajs
- Člen | 86
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
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)
- Ondřej Mirtes
- Člen | 1536
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)
- jasir
- Člen | 746
hurvajs napsal(a):
V 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
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.