NAppForm pri submite straca hodnoty

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

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

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

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 :-))

22
Člen | 1478
+
0
-

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?

Charlie
Člen | 11
+
0
-

Skusal som vkladat „stratenu“ hodnotu offsetu do URL, vtedy to zobrazilo vybranu sadu otazok. K ulozeniu vsak neprislo.

S tymi prazdnymi hodnotami to asi nebude, je tam validacia na FILLED a vzdy som pri testoch hodnoty zadal.

Charlie
Člen | 11
+
0
-

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?

22
Člen | 1478
+
0
-

..pro začátek bych asi začal s příklady z distribuce examples/forms + dokumentace

Charlie
Člen | 11
+
0
-

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

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.

Charlie
Člen | 11
+
0
-

Podarilo sa mi to rozchodit. Problem bol s odovzdavanim parametrov. Potom sa nasledne data neukladali alebo nenatahovali z db.

Dik za ochotu a inspiraciu.