Spracovanie formularu a pristup k prvkom formularu

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

Zdravim Vas,

chcel by som Vas poprosit o pomoc pri rieseni problemu s pristupom k datam odoslanych formularom.
Formular vytvaram nasledovne:

	public function createComponentOdpovedForm($name = 'Elearning')
	{
		$form = new NAppForm($this, $name);
		$vyplnfields = TimanModules::getslideformfield($this->slideid);
		$area = $countfields[0]['count_all'];
		$form->addGroup('')
					->setOption('description', 'aaa');
		$form->addTextarea(100, '', 100, 3)
					->addRule(NForm::FILLED, 'Vyplňte text.')
					->setEmptyValue('jano');
		$fomularfieldscount = count($vyplnfields);
		if ($fomularfieldscount == 1)
		{
			$slidetype      = $vyplnfields[0]['slidetype'];
			$slidefieldid	  = $vyplnfields[0]['slidefieldID'];
			$text           = $vyplnfields[0]['text'];
			if ($slidetype == 'odpoved')
			{
				$form->addGroup('')
							->setOption('description',$text);
				$countanswer = TimanModules::getcountslidefieldanswer($slidefieldid, $this->userid);
				if ($countanswer[0]['count_all']>0)
				{
					$lastanswer = TimanModules::getlastslidefieldanswer($slidefieldid, $this->userid);
					$form->addTextarea(1, '', 100, 3)
								->addRule(NForm::FILLED, 'Vyplňte text.')
								->setEmptyValue($lastanswer[0]['answer']);
				}
				else
				{
					$form->addTextarea(1, '',100, 3)
								->addRule(NForm::FILLED, 'Vyplňte text.');
				}
			}
		}
		echo '<br />fomularfieldscount: '; var_dump($fomularfieldscount);
		echo '<br /> slidetype: '; var_dump($slidetype);
		echo '<br />slidefieldid: '; var_dump($slidefieldid);
		echo '<br />lastanswer: '; var_dump($lastanswer[0]['answer']);

		$form->addImage('odeslat', 'images/p03.jpg', 'Odoslat');
		$form->onSubmit[] = callback($this, 'homeFormSubmitted');
		$form->addProtection('Prosím odošlite formulár znova (bezpečnostný token expiroval).');
		return $form;
	}

pri zobrazeni formulara si nechava vydumpovat aj premenne, ktore v if bloku pouzivam, aby som si overil, ze su spravne naplnene. Formular sa mi zobrazi spravne a obsahuje 2 textarea – jednu pred iff blokov a jednu z if bloku.
Vysledok vypisu je nasledovny

fomularfieldscount: int(1)
slidetype: string(7) "odpoved"
slidefieldid: string(2) "18"
lastanswer: string(10) "ahoj slnko"

podla ocakavani.

Po odoslani formulara a jeho spracovanim funkciou:

	public function homeFormSubmitted($form)
	{
		$formValues = $form->getValues();
		echo '<br />formvalues:';var_dump($formValues);
		exit;
	}

zistujem ze vo $formValues mam data len jednej textarea – vytvorenej pred if blokom.
Textarea vytvarana v if bloku sa do $formValues neprenesie.
Kedze obsah $formValues si dumpujem, a funkcia homeFormSubmitted obsahuje len tento dump prekvapuje, ze ten vypis po odoslani formu je nasledovny

fomularfieldscount: int(0)
slidetype: NULL
slidefieldid: NULL
lastanswer: NULL
formvalues:array(1) { [100]=> string(5) "aaaaa" }

co mi pripada akoby sa create formulara odstartoval po submite este raz, len s tym, ze vsetky premenne su prazdne.
Viete mi niekto poradit ako ziskat aj data z textarea, ktora je vytvarana v if bloku a vysvetlit, preco sa mi po odoslani formulara opat zobrazia vypisy z casti create formulara ako prazdne?

Premenne su naplnane na zaklade dat z databazy a s celym tymto divom bojujem na Nette vo verzii 0.9.6.

Za Vasu pomoc Vam vsetkym vopred dakujem.

22
Člen | 1478
+
0
-

už si se na to stejné ptal tady myslím..
..a odpověď je pořád stejná: formulář se při odeslání sestavuje znovu (bezp. mechanismus) a tedy hodnoty, podle kterých ten form tam ifuješ, jsou jiné při sestavení formulář a jíné při jeho odeslání. Vsadím se, že hodnota $fomularfieldscount nesouhlasí.

Edit: ..máš to tam dokonce vypsané, takže musíš nějak zařídit, aby se to shodovalo.

Editoval 22 (4. 6. 2011 13:41)

folvo
Člen | 16
+
0
-

Nerozumiem potom ako sa mozu zmenit. Ked sa nacitava 1.krat a zobrazuje sa mi spravne, su data v databaze v nejakom stave. Po jeho odoslani v databaze ostavaju tie iste data, takze ak sa nacitaju pri prvom zobrazeni, preco sa potom nenacitaju aj pri odoslani, ked sa formular zostavuje znova.

Ano je pravnda ze $fomularfieldscount pri zostavovani po odoslani je NULL, len nechapem akym sposobom, ked sa nic nezmeni datach v DB.

Tiez nerozumiem preco nasetovana premenna $this->slideid je pri zobrazeni naplnena ale pri zostavovani formulara po odoslani je NULL. Vari sa mi pri zostavovani formulara po odoslani resetnu premenne?

22
Člen | 1478
+
0
-

netuším, kde se bere proměnná $this->slideid, ale předpokládám, že to bude souviset se životním cyklem presenteru. Form by jsi měl defaultníma hodnotama plnit v action metodě., Pokud to plníš až v render fázi, je pozdě.

folvo
Člen | 16
+
0
-

dal by sa problem riesit poslanim slideid zo sablony do createcomponenty pre form?

Do sablony z prezenteru dostanem potrebne id, len ho neviem poslat widgetom do createform :(

22
Člen | 1478
+
0
-

nevím, jestli myslíš toto? https://forum.nette.org/…v-presenteru#…

folvo
Člen | 16
+
0
-

na fore som naniel nieco taketo
v sablone som pridal parameter slideid

{?$component['odpovedForm']['slideid_form']->value = $slideid} {*//<< formuláři předáme ID*}
{control odpovedForm}

ale vo

public function createComponentOdpovedForm($name = 'elearning')

netusim ako sa dostat k jej obsahu.

vo funkcii

public function homeFormSubmitted($form)

ju viem dumpnut ale neviem ako sa k nej dostat v createComponentOdpovedForm.

skusal som aj volanie cez widget

{widget odpovedForm ($slideid)}

ale zjavne neviem ako dostat cez parameter nieco zo sablony do

createComponentOdpovedForm($name = 'elearning')

mozno ze cela moja cesta cez kontrol a widget je zla, ze sa to da urobit nejako inac

folvo
Člen | 16
+
0
-

tak update:

ked to mam spravene tak, ze z template zavolam

{widget odpovedForm}

a v createComponent

public function createComponentOdpovedForm($name = 'elearning',$slideidf = 9, $user = 1)

tak to vytvori pekne formular a data sa pri opatovnom zostavovani netratia.
Zostava mi vyriesit otazku ako poslat cez widget potrebne parametre, ktore su tam teraz default settnute.
Viete mi s tym pomoct?

folvo
Člen | 16
+
0
-

ak sa to cez widget neda poslat, vie mi niekto poradit ako dostanem potrebne parametre do createComponent aby sa som ich pri znovavytvoreny formulara nestratil?

doteraz som to robil nasledovnym sposobom:

class ModulesPresenter extends BasePresenter
{
	var $userid;
	var $moduleID;
	var $slideid;
.
.
.

som si zadefinoval premenne, kde som si ukladal potrebne hodnoty aby som ich mal viditelne v celej triede.

V

	public function renderDefault($moduleID, $slideorder)
	{
		$this->slideid = 5;

som nastavil hodnotu slide
a zo sablovy som volal createComponent formularu.

{widget formualar}

Vysledkom bol formular, ktory sa na zaklade informacie v $this->slideid vytvoril ale po odoslani formulara pri jeho spracovavani sa stratila hodnota v $this->slideid a nastavila sa null, co malo za nasledok, ze pri pokuse o pristup k hodnotam odoslaneho formulara som v getvalues nic nenasiel.

22
Člen | 1478
+
0
-

čteš vůbec, co jsem ti psal??? Komponenta umí přijímat jen signály, defaultní hodnoty se nastavují v action metodě, v render už je pozdě, protože odeslání formu je v životním cyklu presenteru před render metodou, ale to jsem psal již na začátku, takže je potřeba si nastudovat životní cyklus

jinak componenta se tvoří jinak:

protected function createComponentName($name)
{
}

//nebo
protected function createComponent($name = 'name')

nevím, kde jsi přišel na tvůj způsob, ale z API to asi nebylo..

Editoval 22 (4. 6. 2011 19:08)