Nefunguje zpracování formuláře

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

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.

Etch
Člen | 403
+
0
-

Nastává otázka. Si si opravdu jistý že se do té metody ‚demandFormSubmitted‘ opravdu dostaneš?

nAS
Člen | 277
+
0
-

A máš ve formuláři správně zaregistrovaný callback na funkci demandFormSubmitted?

$form->onSubmit[] = array($this, 'demandFormSubmitted');

Edit: Dneska píšu nějak pomalu :-/

Editoval nAS (11. 9. 2009 0:49)

Ondřej Mirtes
Člen | 1536
+
0
-

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
+
0
-

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)

redhead
Člen | 1313
+
0
-

Vypadá to, že v modelu Poptavka (v souboru Poptavka.php) něco vypisuješ na výstup nebo máš nějaké mezery nebo UTF-8 BOM před značkou <?php.

ic
Člen | 430
+
0
-

Nebo může být v kódu nějaká vyjímka / poznámka nebo tak něco co by se podle nastavení výpisu chyb jen tak informačně vypsalo.

jasir
Člen | 746
+
0
-

Laděnka → černá šipka v pravo nahoře → click → ukáže se dosavadní výstup → vidíš něco?

weckho
Člen | 94
+
0
-

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.

jasir
Člen | 746
+
0
-

:-) Můj tip – v souboru Poptavka.php bude něco takového:

<?php
...
$a = $values[jmeno]; //prostě tam nemáš uvozovky okolo klíče pole, má být $a=$values['jmeno']
...
?>

Editoval jasir (12. 9. 2009 12:43)

Ondřej Mirtes
Člen | 1536
+
0
-

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
+
0
-

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
+
0
-

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.