forms – je „isSuccess()“, ale nevrati data
- neznamy_uzivatel
- Člen | 115
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
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
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
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
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
Diky bohu za tohle forum, nevim jak dlouho bych do toho cucel a nedoslo by mi to :)