NAppForm pri submite straca hodnoty
- Charlie
- Člen | 11
Ahojte,
mam nasledovny problem: mam formular s otazkami. Otazok je vela, tak ich chcem
zobrazovat na viackrat. Vzdy po submitnuti formulara chcem odpovede ulozit a
zobrazit dalsiu sadu otazok. Po kliknuti na tlacidlo submit sa vsak stracaju
hodnoty z prvkov vo formulari. Do db sa nic neulozi a po zobrazeni niekolkej
sady otazok sa stratia aj hodnoty niektorych hidden poli.
Viete mi poradit, v com je problem?
public function createComponentSelfForm($name = 'formular')
{
//nacitanie parametrov
$formID = $this->getParam('formID');
$userID = $this->getParam('userID');
$offset = $this->getParam('offset')?$this->getParam('offset'):0;
$limit = $this->getParam('limit')?$this->getParam('limit'):5;
$data = array ('formID'=>$formID,'userID'=>$userID,'limit'=>$limit,'offset'=>$offset);
$defaults = array();
$formStatus = 0;
//db:nacitanie povolenych moznosti odpovede pre radioBox
$values = Forms::fetchQuestOpts($formID);
foreach ($values as $rec)
{
$questOpts[$rec['optID']] = $rec['optText'];
}
//db:nacitanie otazok
$quests = Forms::fetchSelfFormQuestions($data);
//posun offsetu na dalsiu sadu otazok
$offset = $offset + $limit;
$form = new NAppForm($this,$name);
foreach ($quests as $rec)
{
$form->addRadioList($rec['questID'], $rec['questText'],$questOpts)
->addRule(NForm::FILLED, 'Nevybrali ste odpoveď.');
//pri opakovanom zobrazeni vypln ulozenou hodnotou
$defaults[$rec['questID']] = $rec['optID'];
$formStatus = $rec['status'];
}
$form->addHidden('formID');
if ($formID)
$form['formID']->setValue($formID);
$form->addHidden('offset',$offset);
if ($offset)
$form['offset']->setValue($offset);
$form->addHidden('limit',$limit);
if ($limit)
$form['limit']->setValue($limit);
$form->setDefaults($defaults);
$form->addSubmit('send', 'Ďalej');
if($formStatus == STATUS_FINISHED) //ukonceny formular - readonly
{
foreach ($form->getControls() as $control)
{
$control->controlPrototype->readonly = 'readonly';
}
}
if($form->isSubmitted())
{
if($formStatus == STATUS_FINISHED)
{
$data = array ('formID'=>$formID,'userID'=>$userID,'limit'=>$limit,'offset'=>$offset);
$this->redirect('this#selfform',$data);
}
else if ($form->isValid())
{
$form->onSubmit[] = callback($this, 'selfFormSubmitted');
$form->addProtection('Prosím odošlite formulár znova (bezpečnostný token expiroval).');
}
}
return $form;
}
public function selfFormSubmitted($form)
{
//nacitanie dat z formulara
$values = $form->getValues();
$formID = $values['formID'];
$userID = $this->getUser()->getIdentity()->data['userID'];
$limit = $values['limit']?$values['limit']:5;
$offset = $values['offset']?$values['offset']:0;
//ukladanie do db
foreach($values as $key => $rec)
{
if($key!= 'formID' && $key != 'limit' && $key != 'offset') //hiden polia neukladat
{
$data = array('userID'=>$userID,'userID2'=>$userID,'formID'=>$formID,'questID'=>$key,'optID' => $rec);
$id = Forms::insert($data);
}
}
$data = array ('formID'=>$formID,'userID'=>$userID,'limit'=>$limit,'offset'=>$offset);
$this->redirect('this',$data);
}
--/
- Ondřej Mirtes
- Člen | 1536
Odkrokuj si to, abys viděl, kde je chyba.
Na začátku té submit metody si vydumpuj values a uvidíš, jaké tam máš
hodnoty.
- newPOPE
- Člen | 648
No nic proti ale to kopa kooodu ktoru mas v createComponent...
.
Asi by som si to na tvojom mieste rozbil do viacerych metod kvoli
prehladnosti.
Nemoze ti to blbnut kvoli tomuto
$form->setDefaults($defaults);
? pri zostaveni formulara
nastavis prazdne hodnoty a tym padom tam nemas nic. (uz sa mi to parkrat
stalo :-))
- Charlie
- Člen | 11
22 napsal(a):
nejedná se o klasický problém → form se při odeslání sestavuje znovu? Navíc např. ty submit a valid podmínky v komponentě, to vidím prvně, to tam snad ani nemá co dělat, ne?
Pouzil som to z nejakeho prikladu. Asi to s tym ale bude suvisiet. Ked som odstranil nacitanie hodnot cez getValues na zaciatku funkcie createComponentForm, tak sa hodnoty ulozili. Mate niekde priklad podla ktoreho by som to mohol upravit?
- Charlie
- Člen | 11
Tak som to upravil. Nepouzivam NAppForm, ale NForm a zrusil som volanie
callback.
Namiesto toho volam funkciu $this->selfFormSubmitted.
Udaje sa ukladaju v db, ale neviem, ako urobit presmerovanie na nasledujucu
sadu otazok. Redirect mi vyhadzuje NAbortException.
Viete poradit?
Takto spracuvam submitnutie
if($form->isSubmitted())
{
if($formStatus == STATUS_FINISHED)
{
$data = array ('formID'=>$formID,'userID'=>$userID,'limit'=>$limit,'offset'=>$offset);
$this->redirect('this#selfform',$data);
}
else if ($form->isValid())
{
$this->selfFormSubmitted($form);
$form->addProtection('Prosím odošlite formulár znova (bezpečnostný token expiroval).');
$data = array ('formID'=>$formID,'userID'=>$userID,'limit'=>$limit,'offset'=>$offset);
$this->redirect('this',$data);
}
}
- 22
- Člen | 1478
NAppForm je určená pro používání v presenteru, NForm, pokud používáš formuláře extra bez Nette. Takže podle createComponent tipuji, že to máš v presenteru. Odkaz na kotvu v submitu se mi nějak nepodařilo rozchodit, je tu na to už taky někde vlákno..callback onSubmit[] byl v pořádku..jinak zbytku toho formu moc nerozumim.