Spracovanie formularu a pristup k prvkom formularu
- folvo
- Člen | 16
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
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
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?
- folvo
- Člen | 16
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
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
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
č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)