přesměrování na jiný view po odeslání formuláře

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

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

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.

22
Člen | 1478
+
0
-

HosipLan by asi řekl, a to tě v Nette školce neučili, že data do šablony se plní až v render metodě? :-)

nanuqcz
Člen | 822
+
0
-

Takže takhle? :-P

public function postFormSubmitted(Form $form)
{
    $values = $form->getValues();
    $this->formValues = $values;
}

public function render<Action>()
{
    $this->template->formValues = $this->formValues;
}
22
Člen | 1478
+
0
-

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ží?

uestla
Backer | 799
+
0
-

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

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

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

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.

Majkl578
Moderator | 1364
+
0
-

Jednoduše v jedné šabloně by šlo:

{block content}
	{if $presenter['postForm']->isSubmitted()}
		{$presenter['postForm-name']->value}
		{$presenter['postForm-email']->value}
		{$presenter['postForm-address']->value}
	{/if}
	...
	{control postForm}