Jak dát proměnnou z *FormSucceeded do rendereru

S_I_M_O_N
Člen | 23
+
0
-

Zdravím, jsem opět úplně na začátku (omluvte, jestli se ptám na zjevné) a potřeboval bych se zeptat. Zkoušel jsem si vytvořit v Nette formulář. První co mě napadlo je, co kdybych chtěl hodnoty z formuláře hned po získání zpět zobrazit v template.

To znamená:

  1. mám formulář
  2. vyplním ho
  3. kliknu na submit button
  4. pokud vše proběhne správně, tak se data ocitnou ve funkci *FormSucceeded
  5. z funkce *FormSucceeded chci získat hodnoty, které uživatel zadal do toho formuláře, který odeslal a zobrazit je v template (View)

Po dlouhém hledání jsem našel tady na fóru, že to jde tak, že ve funkci *FormSucceeded přidám další parametr do funkce redirect:

public function ....FormSucceeded(UI\Form $form, \stdClass $values): void {
	// ...
	$this->redirect('Default', /*Tady --->*/$values->name);
}

A do „rendereru“ (nevím odborný název, prostě ta funkce s prefixem „render“) akorát přidám argument, do kterého se mi to vloží.

public function renderDefault($name) {
	// tady to muzu poslat do templatu
	$this->template->name = $name;
}

A teď kde je problém
Když tedy formulář odešlu, tak se mi hodnoty, které pošlu do rendereru zobrazí v URL adrese, jakoby to byl GET request, přitom když kouknu jak on ten formulář vykresluje, tak je to formulář action POST.

  1. Poraďte mi prosím, jak to udělám, abych z toho formuláře mohl normálně získat hodnoty a dát je do templatu.
  2. A když jsme u toho, tak jak vlastně udělám formulář action GET (<form action=„get“ …>)?
Marek Bartoš
Nette Blogger | 1146
+
0
-

Většinou se hodnoty v onSuccess někam uloží. Ty si při uložení získáš ID záznamu a přesmeruješ na stránku, kde se daný záznam zobrazuje. Takže něco na způsob

$id = $this->articleTable->insert($values);
$this->redirect('Article', $id);

Jelikož přesměrováváš na jinou stránku, tak si ty údaje musíš nějak předat například přes url, cookie nebo session, příčemž nejvhodnější je to ID v url.

Metoda se nastavuje přes $form->setMethod('get')

Editoval Mabar (12. 10. 2019 18:22)

S_I_M_O_N
Člen | 23
+
0
-

Mabar napsal(a):

Většinou se hodnoty v onSuccess někam uloží. Ty si při uložení získáš ID záznamu a přesmeruješ na stránku, kde se daný záznam zobrazuje. Takže něco na způsob

$id = $this->articleTable->insert($values);
$this->redirect('Article', $id);

Jelikož přesměrováváš na jinou stránku, tak si ty údaje musíš nějak předat například přes url, cookie nebo session, příčemž nejvhodnější je to ID v url.

Metoda se nastavuje přes $form->setMethod('get')

Moc díky za informace. Myslel jsem, že by to mohlo fungovat jako v PHP bez frameworku bez redirektu (zůstal bych na té stránce s tím formulářem po jeho odeslání) tj. že si získám hodnoty z formuláře z pole $_POST[‚…‘] a tedy se mi v URL hodnoty nezobrazí. Tyto hodnoty z $_POST[‚…‘] bych měl v tom templatu. Mohlo by se to hodit, když třeba neprojde validace formuláře, ale nechci uživatelovi zahodit data, která do něj napsal.

Takovýto případ řešit pomocí session nebo cookie by asi bylo trochu overkill.

Šaman
Člen | 2632
+
0
-
  1. Když neredirectuješ, jsi na stránce, která byla vyvolaná requestem ke kterému patří POST s odeslanými hodnotami. Jinak řečeno, při reloadu stránky (třeba F5) se formulář fakticky odešlo znova. To většinou opravdu nechceš.
  2. Při chybě validace se provede událost onError. Tam redirectovat nemusíš.
  3. Předávání parametrů (redirect, link, plink) je jiná věc s formuláři nesouvisející. Často ti stačí předat jen to id záznamu, jehož detail se má zobrazit. Pak to vypadá, že to id (třeba: articles/2) je součástí adresy a nikoliv parametr (articles?article-id=2).

Spravné řešení je tedy:

  • př chybě vypsat chybvá zprávy a neredirectovat
  • při úspěšném odeslání zpracovat data z provést redirect na nějakou stránku s výsledky, nebo detail vloženého záznamu
  • nezávisle mít onu stránku s výsledky, nebo detailem. Na tu se mhže redirectovat po úspěšném odeslání, ale lze se na ni taky proklikat prostě jako na detail nějakého záznamu (takže ze seznamu zaznamů povedou obyčejné odkazy na tuto stránku).

Editoval Šaman (13. 10. 2019 11:29)