Vlastny submit formulára pred jeho odoslaním
- IvanM
- Člen | 14
Nette- 2.0
php 5.3.8
Mám otázku ohľadom formulárov
Mám vlatný dynamicky vytvorený formulár a potrebujem, aby po stisknutí
tlačítka sa mi spustila vlastná funkcia, ktorá nejak sparsuje hodnoty vo
formulári a následne urobí redirect na ten istý prezenter na ktorom sa
nachádza, pričom parametrom budú sparsované hodnoty.
Nemôžem použiť onSubmit ani onSuccess, pretože tie sa zavolajú až po tom,
ako sa odošle formulár.
Ja chcem, aby sa tá funkcia zavolala pred jeho odoslaním a odoslanie
neprebehlo.
kód :
<?php
protected function createComponentBlockTestForm() {
$form = new Form();
//pridavanie poloziek
$form->addSubmit('send','Odoslať');
return $form
}
public function blockTestFormSubmitted(Nette\Application\UI\Form $form){
$values = $form->getValues(true);
//parsovanie values do premennej $newJson
$this->redirect('Test:blockTest', $newJson);
}
?>
vo Funkcií createComponentBlockTestForm vytvorím formulár a chcem aby sa funkcia blockTestFormSubmitted zavolala po kliknutí na tlačítko Odoslať, pričom aby sa zavolala PRED odoslaním formulára ale po jeho validácií
ďakujem
- castamir
- Člen | 629
Pořád jsi neodpověděl.
Každopádně odeslání formuláře spustí signál viz obrázek životního cyklu presenteru, takže pokud to odešleš, tak metodám startup a action* se vážně nevyhneš, ale to ti vadit nemusí, protože přes metodu isSubmutted můžeš ověřit, zda daný formulář je odeslán.
Mělo by fungovat něco podobného, ale upozorňuji, že je to velice nestandardní a chybí tomu ošetření hodnot. Každopádně jsi pořád nenapsal, proč to potřebuješ, ale jen jak to něco něznámého chceš vyřešit.
public function actionDefault() {
$form = $this['nazevTveKomponenty'];
if ($form->isSubmutted()) {
$this->redirect('this', array('fooParam' => $form->values->foo));
}
}
- IvanM
- Člen | 14
opíšem čo robím
po stisknutí tlačítka odoslať sa získajú z formu hodnoty, tie
sparsujem do JSON objektu ktorý odošlem do nie latte php triedy na
spracovanie. Tá mi vráti nejaký iný JSON objekt, ktorý dám ako atribút do
tohto presenteru
Následne chcem aby sa mi znova načítal tento presenter a teda aby sa vytvoril
nový form, ktorého položky budú vytvorené na základe hore spomínaného
atribútu triedy.
Viem že je to komplikované, ale je požiadavka aby existovala samostatná čisto php trieda, ktorej vstupom a výstupom je JSON objekt a na základe výstupu sú vygenerované položky formulára
- castamir
- Člen | 629
Tady máš kostru. Vůbec se mi nezdá to, co popisuješ, ale tohle by tě mohlo nakopnout…
class MagicPresenter extends BasePresenter
{
public function actionDefault()
{
if (!$this['setup']->isSubmitted) {
// thing that can be done only if setup form is NOT submitted
}
}
/**
* @return \Nette\Application\UI\Form
*/
protected function createComponentSetup()
{
$form = new \Nette\Application\UI\Form();
// add input for next form
$form->addSubmit("send", "Odeslat");
$form->onSuccess[] = $this->setupSucceeded;
return $form;
}
/**
* @param \Nette\Application\UI\Form $form
*/
public function setupSucceeded(\Nette\Application\UI\Form $form)
{
$this->show($form->values);
}
/**
* @return \Nette\Application\UI\Form
*/
protected function createComponentNew()
{
$form = new \Nette\Application\UI\Form();
// dynamic content
$form->onSuccess[] = $this->newSucceeded;
return $form;
}
/**
* @param \Nette\Application\UI\Form $form
*/
public function newSucceeded(\Nette\Application\UI\Form $form)
{
}
private function show($spell) {
$wizard = new Wizard();
$trick = $wizard->doMagic($spell);
// do something with the trick, e.x. $this['new']->addText();
$this->template->showNew = TRUE;
}
}
class Wizard {
/***/
public function doMagic($in)
{
// do some magic
return $out;
}
}
{control setup}
{default $show = FALSE}
{if $show}
{control new}
{/if}