přesměrování na jiný view po odeslání formuláře
- desss
- Člen | 14
zdravím,
na stránce (https://doc.nette.org/cs/forms) je
formulářům v presenterech věnováno poměrně málo, zeptám se tedy
tady:
mám na stránce umístěný formulář, který po odeslání přesměruje
uživatele na jinou stránku (na které budou vypsány vyplněné údaje), není
mi jasné jak to v Nette správně udělat. zde je konkrétní kód:
<?php
use Nette\Application\UI\Form;
class HomepagePresenter extends BasePresenter {
protected function createComponentPostForm() {
$slots = array(...);
$form = new Form;
...
$form->onSuccess[] = callback($this, 'postFormSubmitted');
$form->setAction($this->link('brackets'));
return $form;
}
...
public function postFormSubmitted(Form $form) {
$values = $form->getValues();
$this->redirect('sent', $values->bar);
}
...
public function renderSent($bar) {
...
$this->template->foo = $values->bar;
}
}
?>
jsem si poměrně jistý, že problém řeším složitě a navíc i nesprávně – po odeslání formuláře je uživatel odkázán na stránku (www/homepage/sent?bar=3), což je pouze jiný View s parametrem předaným přes url – uživatel může zadat např ?bar=abc a validace, která probíhá při odeslání formuláře se úplně obejde (zavolá se pouze View „sent“ s parametrem bar). chci se tedy zeptat, jak „nastavit“ View po odeslání formuláře (aby při přístupu na tento view probíhala validace formuláře)
ps. jeden z důvodů přesměrování na jiný view je i to, že přijatá data na stránce s formulářem nelze vypisovat … logicky dokud nejsou odeslaná – jak říkám, možná vše řeším složitě, ale v dokumentaci jsem odpověď na toto (pro Nette 2.0) nenašel.
děkuji
- nanuqcz
- Člen | 822
Ahoj, data přijatá z formuláře můžeš hned i vypsat. Stačí je v
postFormSubmitted()
uložit do šablony a zrušit to
přesměrování:
public function postFormSubmitted(Form $form) {
$values = $form->getValues();
$this->template->formValues = $values;
}
Pokud to chceš kvůli např. potvrzení objednávky před odesláním, tohle by mělo fungovat.
- uestla
- Backer | 799
Nemyslím, že by chtěl něco validovat na jiném view, spíše má skutečně na mysli něco jako https://forum.nette.org/…-zpet-submit
Doplňující rada:
Rovnou z definice formuláře odstraň
$form->setAction($this->link('brackets'));
nemá to totiž žádný vliv (akce je u aplikačních formulářů nastavována automaticky při připnutí k rodičovské komponentě).
- desss
- Člen | 14
22 napsal(a):
když už tak:
$this->formValues = $form->getValues(); //usšetříš řádek a proměnnou
ale mě se nějak spíš nezdá, proč kolega přesměrovává na jiné view po odeslání formuláře a tam chce něco teprve validovat? To má být nějaké preview a pak se teprve data uloží?
hmmm, default.latte:
{block content}
{control postForm}
{dump $formValues}
{/block}
dump bych musel obalit do {if isset($formValues)}, to přeci není nejlepší řešení no ne?
to uestla: byl si rychlejší, tím setAction() sem myslel že se to bude řešit, takže asi ne :)
Editoval desss (28. 8. 2011 1:11)
- 22
- Člen | 1478
validovat musíš káždopádně při zpracování toho formu a pak až přesměrovat na jiné view a tam si ty data zase znovu zbuildovat, jak chce šablona toho view. Takže akorát si vymysli, jak ty data přeneseš na do jiného view, jestli přes GET/POST/SESSION/DB nevím, co ještě :-)
Jestli jde o náhled, tak to můžeš přece udělat podobně, jako v PHP, data jsou odeslána, schováš formulář a ukážeš data na stejném view/ani nepotřebuješ jiné..
respektive proč ta data vypisuješ na jiném view a co s těma datam děláš, když jsou validní?
- desss
- Člen | 14
22 napsal(a):
respektive proč ta data vypisuješ na jiném view a co s těma datam děláš, když jsou validní?
a jak by měl podle tebe View vypadat? mě napadá jen toto řešení:
default.latte:
{block content}
{control postForm}
{if isset($values->name)}{$values->name}{/if}
{if isset($values->email)}{$values->email}{/if}
{if isset($values->address)}{$values->address}{/if}
...
{/block}
jinak je to plné notice o nedeklarovaných proměnných
desss napsal:
ps. jeden z důvodů přesměrování na jiný view je i to, že přijatá data na stránce s formulářem nelze vypisovat … logicky dokud nejsou odeslaná – jak říkám, možná vše řeším složitě, ale v dokumentaci jsem odpověď na toto (pro Nette 2.0) nenašel.