forms – je „isSuccess()“, ale nevrati data

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

Zdravím,
mám formulář řešený podle https://phpfashion.com/…-v-nette-2-1 – vykresluji pomocí vlastní šablony.

v latte sabloně presenteru (default.latte) mám formulář:

<?php
<form n:name=orderForm>
 <input n:name="jmeno" type="text" value="" />
 <input n:name="email" type="text" value="" />
 <input n:name="submit" type="submit" value="Odeslat" />
</form>
?>

v jednoduchý presenteru kód dle manuálu

<?php
public function renderOrder () {
	$form = new Form;
	if ($form->isSuccess()) {
		echo 'Formulář byl správně vyplněn a odeslán';
		$values = $form->getValues();
		var_dump($values->jmeno); // chyba - "jmeno" je undefined
		var_dump($values); // vypíše prázdné
	}
}

protected function createComponentOrderForm() {
	$form = new Form;
	$form->addText('jmeno')->setRequired();
	$form->addText('email')->setRequired();
	$form->addSubmit('submit');
	return $form;
}
?>

Problém je, že i když nette řekne, že je formulář v pořádku odeslaný, tak se mi nějak nedaří načíst odeslané hodnoty. Poradíte prosím? Díky :)

Editoval neznamy_uzivatel (8. 6. 2014 12:50)

Tabetha
Člen | 140
+
0
-

Prečo je tam toto?

public function renderOrder () {
    $form = new Form;
...
}

to ti predsa vytvorí nový formulár, prázdny.

public function renderOrder(){
	$form = $this['orderForm']; // alebo ako píše **David Grundl** $this->getComponent('orderForm')
....
}

Toto by mohlo fungovať

Editoval Tabetha (8. 6. 2014 13:01)

duke
Člen | 650
+
0
-

Zkus nahradit:

<input n:name="jmeno" type="text" value="" />

za

<input n:name="jmeno" />

… a @Tabetha má pravdu.
Mimochodem po úspěšném zpracování formuláře je dobrým zvykem přesměrovat (zabrání se tak nechtěnému opakovanému odeslání formuláře). Tzn. že render metoda pak už přímo s formulářem pracovat nemusí.

Editoval duke (8. 6. 2014 13:03)

David Grudl
Nette Core | 8233
+
+5
-

Tím $form = new Form; jsi v metodě render vytvořil úplně nový a prázdný formulář. Zavolej si metodu createComponentOrderForm() nebo ještě lépe použij sdílený přístup přes getComponent(‚orderForm‘), která createComponentOrderForm() zavolá jen jednou a pak vrací stále stejný formulář.

mkoubik
Člen | 728
+
0
-

Protože ten $form na kterém to voláš vytváříš znovu – není to ta definovaná komponenta. Buď použij $this['orderForm']->isSuccess(), nebo ještě lépe si v továrničce nastav callback $form->onSuccess[] = array($this, 'formSuccess'), v něm si nastav persistentní parametry a přesměruj. V renderOrder() pak pracuj jen s těmi persistentními parametry.

neznamy_uzivatel
Člen | 115
+
0
-

Diky bohu za tohle forum, nevim jak dlouho bych do toho cucel a nedoslo by mi to :)