Po nastavení radioList $name na ID z databáze vrací getValues() null

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

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

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

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é.

frosty22
Člen | 373
+
0
-

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

Stejsi
Člen | 21
+
0
-

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

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ší
?>
Stejsi
Člen | 21
+
0
-

frosty22 napsal(a):
Jo a ještě jedna maličkost, jak koukám tak přetypováváš…

Ano děkuji, ovšem na výsledku to nic nezmění.

frosty22
Člen | 373
+
0
-

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

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

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

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

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

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

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

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

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!

frosty22
Člen | 373
+
0
-

Tak já tuhle problematiku znám hlavně ze dynamických selectů tj. selecty kdy se například v jenom vybírají kraje a podle toho se do druhého načtou přes JS města. Ale již na to nějaké komponenty zde existují, ale pro tvůj případ to nebude.