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.