Po nastavení radioList $name na ID z databáze vrací getValues() null
- Stejsi
- Člen | 21
Ahoj, nemohu vyřešit problém s tím že mi nepřijdou hodnoty, které vytvořím cyklem z databázových klíčů.
- vytvářím radioButtony a name jim chci dát jako id z databázové tabulky
- nejdřív jsem iteroval přímo nad selectem z databáze
- potom, když jsem se dočetl že getValues dostane jen referenci na objekt jsem to přetypoval z objektu na pole, ale nepomohlo to
- pole1 a pole2 je v úkazce jen pro otestování funkčnosti
Kód:
public function createComponentTestForm()
{
$pole = array();
$pole['11111'] = "a";
$pole['22222'] = "b";
$pole['33333'] = "c";
$pole2 = array();
$pole2['1'] = "1";
$pole2['2'] = "2";
$pole2['3'] = "3";
// $this->textQuestion je dotaz z databáze
$ppole = $this->textQuestion->fetchPairs('id','cz');
$pppole = (array) $ppole;
Debugger::barDump($pppole, "YYY");
foreach ($pppole as $key => $value) {
$form->addRadioList($key, $value, $pole2);
}
$form->addSubmit('change', 'ok')
->setDisabled(FALSE);
$form->onSuccess[] = $this->testFormSucceeded;
return $form;
}
public function testFormSucceeded($form)
{
$vals = (array) $form->getValues();
Debugger::barDump($vals, "XXX");
}
proměnná $pppole je tedy pole vytažené z databáze, po odeslání tohoto
mi přijde dumb „XXX“ vypíše pole „klíč“ ⇒ NULL (např. 988 ⇒
NULL)
pokud změním v foreach $pppole na $pole tak hodnoty bezproblémů
přijdou.
dumb „YYY“ vypíše pole tak jak si hop představuji
Děky moc za pomoc
- frosty22
- Člen | 373
No z toho kodu jsem trošku zmaten, ale jen v kostce takhle by to nešlo:
<?php
$container = $form->addContainer("questions");
$results = array(1 => 1, 2 => 2, 3 => 3);
foreach ($this->textQuestion as $row) {
$container->addRadioList($row["id"], $row["cz"], $results);
}
?>
Editoval frosty22 (6. 8. 2013 12:10)
- Stejsi
- Člen | 21
frosty22 napsal(a):
No z toho kodu jsem trošku zmaten, ale jen v kostce takhle by to nešlo:
<?php $container = $form->addContainer("questions"); $results = array(1 => 1, 2 => 2, 3 => 3); foreach ($this->textQuestion as $row) { $container->addRadioList($row["id"], $row["cz"], $results); } ?>
Myslím že díky tvé odpovědi si to pochopil dobře, kód, který si mi
poslal, by měl fungovat, ale vrací opět Pole s indexem, ale s hodnotamu
NULL.
Přikládám ještě link na to co vypíš proměnná $vals.
"":http://img19.imageshack.us/…377/yiav.png
A ještě doplním že formulář na úrovni zdrojového kódu HTML vypadá
naprosto v pořádku. Prostě divné.
- Stejsi
- Člen | 21
frosty22 napsal(a):
Tak toto by měl vrátit v případě, že nejsou vybrané žádné odpovědi. A vybral jsi tedy odpovědi (předpokládám, že ano ale ptám se jen pro jistotu)?
Ano vybral, ale úplně nefunkční ten formulář není – když si například nechám poslat hidden, tak normálně příjde. Nefunkční je pouze v tom případě kdy iteruji, tak jak si mi také poslal, nad selectem z databáze.
- frosty22
- Člen | 373
Jo a ještě jedna maličkost, jak koukám tak přetypováváš výsledek na pole, tak tím pouze přetypuješ danou proměnnou nikoliv rekurzivně, na to je lepší použít getValues(TRUE) – tedy pokud nemáš starší verzi, podpora pro vrácení do pole byla přidána někdy okolo 2.0.2 odhaduji
<?php
$vals = (array) $form->getValues();
$vals = $form->getValues(TRUE); // Lepší
?>
- frosty22
- Člen | 373
Ten zakopaný pes musí být jinde, podle toho screenshotu se ti identifikátory těch radiolistů vykreslili dobře, ale ztratili se hodnoty.
Uvádíš, že jinak to funguje pouze u selection – čili v tom mém příklad, když bys udělal pro test:
<?php
$this->textQuestion = array(1 => "Foo", 2 => "Bar");
$container = $form->addContainer("questions");
$results = array(1 => 1, 2 => 2, 3 => 3);
foreach ($this->textQuestion as $row) {
$container->addRadioList($row["id"], $row["cz"], $results);
}
?>
Tak to vrátí ty výsledky správně?
Případně ještě zkus:
<?php
$this->textQuestion = array("1" => "Foo", "2" => "Bar");
?>
Tak či tak, pokud by něco z toho fungovalo, tak to vypadá na chybu v Nette – tak pak zkus uvést jakou máš verzi Nette.
Editoval frosty22 (6. 8. 2013 12:46)
- Stejsi
- Člen | 21
Tak jsem se mírně posunul a teprve teď zjistil že to vlivňuje
nepochopitelně ten dotaz.
nefunguje (ačkoliv dotaz je průchozí a vypsatelnej)
$this->context->wordRepository->findAll()->where('image = "" ' . ' AND field_id IN (' . $ids . ')')->order('rand()')->limit(14);
funguje:
$this->context->wordRepository->findAll()->limit(10);
Že by nějaká chyba s funkcí rand() ?
Edit: dělá o ten rand() !
Editoval Stejsi (6. 8. 2013 12:57)
- David Matějka
- Moderator | 6445
ano, dela to ten rand. kostra formulare totiz musi byt sestavena stejne pri vykreslovani i pri zpracovani, odeslane hodnoty se totiz „mapuji“ na tu kostru. je to kvuli bezpecnosti, aby tam nekdo nepodstrcil hodnoty, co nechces
- frosty22
- Člen | 373
Ahá, takže příklad je trošku jiný než-li jsi uváděl.
Protože ten random ti může při vykreslení vrátit jiné výsledky než-li po odeslání dat z formuláře a jeho znovu sestavení, čili nette ti je vyfiltruje, jelikož to bere jako podvržení dat, což je samozřejmě bezpečnostní problém. A tudíž žádná chyba nette.
- Stejsi
- Člen | 21
matej21 napsal(a):
ano, dela to ten rand. kostra formulare totiz musi byt sestavena stejne pri vykreslovani i pri zpracovani, odeslane hodnoty se totiz „mapuji“ na tu kostru. je to kvuli bezpecnosti, aby tam nekdo nepodstrcil hodnoty, co nechces
<offtopic>
Když teda potřebuju pár náhodných záznamů tak mám načíst všechny a
vybrat z nich náhodně pomocí PHP?
- frosty22
- Člen | 373
No jde o to složit pokaždé ten formulář stejně, resp. při vygenerování a po odeslání. Čili potřebuješ si uložit ty náhodné hodnoty, které vykreslíš v tom formuláři a následně po odeslání vytáhnout ty samé – čili potom již nevytahovat znovu random.
Trošku je problém, že k těm datům po odeslání formuláře se dostaneš buď „prasečinou“ a nebo až po složení formuláře, což již je pozdě.
Prasácká cesta je strčit do hidden elementu ty IDčka radiolistů a potom v případě, kdy je formulář odeslán v cyklu vykreslení se podívat do HttpRequest, vzít ty ID a sestrojit ten samý formulář.
Alternativní druhá cesta, která je již čistějším řešením je, znovu prvně vygenerovat randomem ty elementy, následně při vykreslení si uložit IDčka do SESSION. A poté pokud je odeslán formulář a existuje tato SESSION, tak si vytáhnout ty IDkča ze session a znovu sestrojit ten samý formulář.
- Stejsi
- Člen | 21
frosty22 napsal(a):
Ahá, takže příklad je trošku jiný než-li jsi uváděl.
Protože ten random ti může při vykreslení vrátit jiné výsledky než-li po odeslání dat z formuláře a jeho znovu sestavení, čili nette ti je vyfiltruje, jelikož to bere jako podvržení dat, což je samozřejmě bezpečnostní problém. A tudíž žádná chyba nette.
To že Nette kontroluje hodnoty oproti datazu je sice hezké, ale v tom případě by si mělo zapamatovat co bylo výstupem toho dotazu – včetně náhodného selectu, jen můj názor.
- frosty22
- Člen | 373
Tak to je hloupost. Tady nejde o kontrolu hodnot oproti dotazu, on neví že tam máš nějaký dotaz na databázi!
Prostě ty složíš prvně formulář kde máš inputy:
otazka[2]
otazka[5]
otazka[7]
Takto se ty data odešlou, ale ty pak ten formulář složíš jako:
otazka[1]
otazka[3]
otazka[6]
Tím automaticky nette zjistí, že takto ten formulář ale není a ty data ti vyfiltruje, což je naprosto správně a nemůže být jinak.
Nette neví, že jde o dynamický formulář, kde tyto skládáš pokaždé jinak. A kdyby ano, tak by si muselo ty stavy uložit předtím třeba do SESSION, či jinam aby to mohl znovu složit stejně. Ale víceméně tohle se nestává zrovna často (= víceméně nikdy až na specifický případ co máš ty), a musela by to být nějaká nástavba nad form, protože formulář jako takový by neměl být závislý zbytečně na SESSION.
Editoval frosty22 (6. 8. 2013 13:16)
- Stejsi
- Člen | 21
frosty22 napsal(a):
No jde o to složit pokaždé ten formulář stejně, resp. při vygenerování a po odeslání. Čili potřebuješ si uložit ty náhodné hodnoty, které vykreslíš v tom formuláři a následně po odeslání vytáhnout ty samé – čili potom již nevytahovat znovu random.
Trošku je problém, že k těm datům po odeslání formuláře se dostaneš buď „prasečinou“ a nebo až po složení formuláře, což již je pozdě.
Prasácká cesta je strčit do hidden elementu ty IDčka radiolistů a potom v případě, kdy je formulář odeslán v cyklu vykreslení se podívat do HttpRequest, vzít ty ID a sestrojit ten samý formulář.
Alternativní druhá cesta, která je již čistějším řešením je, znovu prvně vygenerovat randomem ty elementy, následně při vykreslení si uložit IDčka do SESSION. A poté pokud je odeslán formulář a existuje tato SESSION, tak si vytáhnout ty IDkča ze session a znovu sestrojit ten samý formulář.
S tím seassion mě to taky napadlo, ale myslel jsem že se to ještě vyřeší „po dobrém“ =D . Nejhorší je najít příčinu, tu už nezapomenu po tom urputném hledání do smrti. =D
Díky všem za pomoc!