Nefunguje zpracování formuláře
- weckho
- Člen | 94
Ahoj,
v presentru mám následující metodu obsluhující odeslání formuláře mailem:
public function demandFormSubmitted(AppForm $form)
{
if ($form['odeslat']->isSubmittedBy()) {
$poptavka = new Poptavka;
$poptavka->sendMail($form->getValues());
$this->flashMessage('Poptávka byla odeslána.');
}
$this->redirect('default');
}
Předtím vytvářím komponentu formuláře, mám v ní:
$form->addSubmit('odeslat', 'Odeslat');
V metodě, která data zpracovává, se neprovede if podmínka. Nevím proč. Na jiném webu mi to funguje bez problémů, metody jsem z něj zkopíroval, nette samotné také (abych si ověřil, že to není verzí, nebo tak).
Ještě dodám, že aplikace se chová tak, že odešlu vyplněný formulář a jsem vrácen zpět na stránku s formulářem, žádná chyba, nic. Vše vypadá, jako by byl formulář odeslán (až na to, že není, ani flash zpráva se nevypíše).
Neví někdo, čím by to mohlo být? Díky moc.
- Ondřej Mirtes
- Člen | 1536
A proč tam tu podmínku máš? Chápal bych to, kdybys ověřoval, na které tlačítko ve formuláři uživatel kliknul, ale tady není potřeba. Normálně vypadá submitovací metoda takto:
public function formSubmitted(AppForm $form) {
try {
$poptavka = new Poptavka;
$poptavka->sendMail($form->getValues());
$this->flashMessage('Odeslání formululáře proběhlo v pořádku.');
$this->redirect('this');
} catch (SomeModelExcepion $e) { //výjimka, kterou vyhazuje model
$form->addError($e->getMessage()); //error se přidá do formuláře, nedojde k redirectu a uživatel může po sobě chybná data opravit
}
}
A v továrničce na formulář se registruje takto (předpokládám, že to tam máš, ale ten kód jsi neukázal, tak pro jistotu):
$form->onSubmit[] = array($this, 'formSubmitted');
Editoval LastHunter (11. 9. 2009 0:49)
- weckho
- Člen | 94
Ahoj,
Etch: Ano, jsem si jistý, když dám do metody nějaký kód mimo tu podmínku, tak se provede.
nAS: Ano, to tam mám.
LastHunter: Zkusil jsem kód upravit dle tvé rady a teď mi to po odeslání formuláře hlásí následující chybu, nevím si s tím rady:
InvalidStateException
Cannot set HTTP code after HTTP headers have been sent (output started at /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php:9).
Line 70: 500=>1, 501=>1, 503=>1, 505=>1
Line 71: );
Line 72:
Line 73: if (!isset($allowed[$code])) {
Line 74: throw new InvalidArgumentException("Bad HTTP response '$code'.");
Line 75:
Line 76: } elseif (headers_sent($file, $line)) {
Line 77: throw new InvalidStateException("Cannot set HTTP code after HTTP headers have been sent" . ($file ? " (output started at $file:$line)." : "."));
Line 78:
Line 79: } else {
Line 80: $this->code = $code;
Line 81: $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1';
Line 82: header($protocol . ' ' . $code, TRUE, $code);
Line 83: return TRUE;
Line 84: }
Děkuji za pomoc.
Editoval weckho (12. 9. 2009 12:31)
- weckho
- Člen | 94
Jasir: Vypadá to, že se prostě data z formuláře neodešlou:
Notice: Use of undefined constant jmeno - assumed 'jmeno' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 9
Notice: Use of undefined constant mesto - assumed 'mesto' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 10
Notice: Use of undefined constant telefon - assumed 'telefon' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 11
Notice: Use of undefined constant volat_od - assumed 'volat_od' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 12
Notice: Use of undefined constant volat_do - assumed 'volat_do' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 12
Notice: Use of undefined constant poznamka - assumed 'poznamka' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 13
Notice: Use of undefined constant jmeno - assumed 'jmeno' in /home/studyo/public_html/mujweb.cz/app/models/Poptavka.php on line 16
Pro jistotu přikládám celý PoptavkaPresenter:
require_once dirname(__FILE__) . '/BasePresenter.php';
class PoptavkaPresenter extends BasePresenter
{
protected function createComponent($name)
{
switch ($name) {
case 'demandForm':
$produkty['a'] = "Služba";
$produkty['b'] = "Služba";
$produkty['c'] = "Služba";
$produkty['d'] = "Služba";
$produkty['e'] = "Služba";
$produkty['f'] = "Služba";
$hodiny['1'] = 1;
$hodiny['2'] = 2;
$hodiny['3'] = 3;
$hodiny['4'] = 4;
$hodiny['5'] = 5;
$hodiny['6'] = 6;
$hodiny['7'] = 7;
$hodiny['8'] = 8;
$hodiny['9'] = 9;
$hodiny['10'] = 10;
$hodiny['11'] = 11;
$hodiny['12'] = 12;
$hodiny['13'] = 13;
$hodiny['14'] = 14;
$hodiny['15'] = 15;
$hodiny['16'] = 16;
$hodiny['17'] = 17;
$hodiny['18'] = 18;
$hodiny['19'] = 19;
$hodiny['20'] = 20;
$hodiny['21'] = 21;
$hodiny['22'] = 22;
$hodiny['23'] = 23;
$hodiny['24'] = 24;
$form = new AppForm($this, $name);
$form->addText('jmeno', 'Jméno a příjmení:')
->addRule(Form::FILLED, 'Vyplňte prosím jméno!');
$form->addText('mesto', 'Město:');
$form->addSelect("produkt", "Zajímá mě:", $produkty);
$form->addText('telefon', 'Telefon:')
->addRule(Form::FILLED, 'Vyplňte prosím telefon!');
$form->addSelect("volat_od", "Volat:", $hodiny);
$form->setDefaults(array('volat_od' => '8'));
$form->addSelect("volat_do", "Do:", $hodiny);
$form->setDefaults(array('volat_do' => '20'));
$form->addTextarea('poznamka','Poznámka:');
$form->addSubmit('odeslat', 'Odeslat');
$form->addProtection('NEodesláno, prosím, zkuste to znovu.');
$form->onSubmit[] = array($this, 'demandFormSubmitted');
return $form;
default:
parent::createComponent($name);
}
}
public function demandFormSubmitted(AppForm $form)
{
try {
$poptavka = new Poptavka;
$poptavka->sendMail($form->getValues());
$this->flashMessage('Odeslání formululáře proběhlo v pořádku.');
$this->redirect('this');
} catch (SomeModelExcepion $e) { //výjimka, kterou vyhazuje model
$form->addError($e->getMessage()); //error se přidá do formuláře, nedojde k redirectu a uživatel může po sobě chybná data opravit
}
}
/********************* view default *********************/
public function renderDefault()
{
$this->template->title = "Předběžná poptávka";
$this->template->form = $this->getComponent('demandForm');
}
}
Děkuji za pomoc.
- Ondřej Mirtes
- Člen | 1536
setDefaults
musíš volat až po přidání všech
formulářových polí a nastavit tam všechny defaultní hodnoty najednou
(v jednom poli).
A taky už tam nevolej return $form
, protože k připojení
formuláře dojde při zavolání konstruktoru AppForm.
Editoval LastHunter (12. 9. 2009 13:02)
- weckho
- Člen | 94
Coool – Tvůj tip je správný :-) Jenom je divný, že na jiným webu, z kama jsem script přebral, mi to funguje bez těch uvozovek.. Ale je to jedno, hlavně že to teď funguje všude.
EDIT: LastHunter: Díky, opraveno dle tvých doporučení.
Díky moc všem za pomoc!
Editoval weckho (12. 9. 2009 13:05)
- jasir
- Člen | 746
Je to kvůli přísnějšímu nastavení error_reporting
Vyzkoušej si do bootstrapu přidat
<?php
Debug::$strictMode = TRUE;
?>
Každá notice/warning pak vyhodí vyjímku.