Select box naplnění daty pomocí fetchPairs

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

mám problém se Select Boxem, který plním pomocí fetchPairs jsem zjistil, že když ten výběr dám srovnat podle jména dostanu jiný select box než když dám srovnat podle ID resp. k popiskům jsou přiřazeny různé indexy.
Výstup z fetchPairs je v pořádku tam jsou data jak mají být v obou případech. Problém musí být někde ve zpracování select boxu.

NetteFramework-1.0dev-PHP5.2
PHP 5.2.9 (Windows NT V1 5.2 build 3790)

Jan Tvrdík
Nette guru | 2595
+
0
-

Pokud jsi ručně nenastavil $useKeys na FAlSE, tak to musí fungovat.

svobodai
Člen | 136
+
0
-

Jan Tvrdík napsal(a):

Pokud jsi ručně nenastavil $useKeys na FAlSE, tak to musí fungovat.

Ne nic jsem nenastavoval. Napsal jsem jen takovýto řádek

<?php
$form->addSelect('nacionality','Národnost',$enums['nacionality'])->skipFirst();
?>

kde $enums je definované pole s poly pro selctboxy a checkboxy.
Přesto pokud nechám ten seznam srovnat podle jména tak vyjde jiný obsah Optionů než při seřazení podle ID.

Editoval svobodai (24. 6. 2010 12:26)

22
Člen | 1478
+
0
-

A není to logický? Pořadí ID se přece nemusí shodovat z abecedním pořadím nebo jsem to blbě pochopil? Káždopádně zkus Debug::dump() a uvidíš, jaký data jdou do selectBoxu.

svobodai
Člen | 136
+
0
-

22 napsal(a):

A není to logický? Pořadí ID se přece nemusí shodovat z abecedním pořadím nebo jsem to blbě pochopil? Káždopádně zkus Debug::dump() a uvidíš, jaký data jdou do selectBoxu.

Ano pořadí ID se samozřejmně nemusí schodovat s abecedním. Problém je v to, že mi to dá toto

pro seřazeno podle ID
<select size="6" onfocus="this.onmousewheel=function(){return false}" name="activities[]" id="frmregister-step2-activities" multiple="multiple">
	<option value="0">– Vyberte –</option>
	<option value="1" selected="selected">Chodím</option>
	<option value="2">Běhám</option>
	<option value="3">Lezu</option>
	<option value="4" selected="selected">Plavu</option>
</select>

pro seřazeno podle jména
<select size="6" onfocus="this.onmousewheel=function(){return false}" name="activities[]" id="frmregister-step2-activities" multiple="multiple">
	<option value="0">– Vyberte –</option>
	<option value="1" selected="selected">Běhám</option>
	<option value="2">Chodím</option>
	<option value="3">Lezu</option>
	<option value="4" selected="selected">Plavu</option>
</select>

Což jak jistě chápete, že to není to samé. Potřeboval bych aby to ten výsledek udělalo takto.

pro seřazeno podle ID
<select size="6" onfocus="this.onmousewheel=function(){return false}" name="activities[]" id="frmregister-step2-activities" multiple="multiple">
	<option value="0">– Vyberte –</option>
	<option value="2">Běhám</option>
	<option value="1" selected="selected">Chodím</option>
	<option value="3">Lezu</option>
	<option value="4" selected="selected">Plavu</option>
</select>
nAS
Člen | 277
+
0
-

Ukaž nám ten dotaz a dump($enums['nacionality']);

toka
Člen | 253
+
0
-

To se mi stávalo taky, a nedokázal jsem to nijak ošetřit. Měl jsem fetchPairs, který vracel id a jmeno, ale na při použití addSelect vůbec nebylo bráno v potaz id, ale indexy začaly samy od jedné. Problém byl ale v tom, že jsem načetl data z databáze a následně použil array_merge:

$data = $this->model->getDataFilterPairs(); // sql> ORDER BY name

$druh = array_merge(array(0 => ' - nerozhoduje - '), $data);

Jedině co šlo, bylo zrušit ORDER BY name, nebo array_merge. Funkci array_merge se zřejmě nelíbí, že pořadí indexů není lineární (1, 2, 3, 4, …).

nAS
Člen | 277
+
0
-

V manualu se pise:

If all of the arrays contain only numeric keys, the resulting array is given incrementing keys starting from zero.

Pokud potrebujes spojit pole s numerickymi indexy s jejich zachovanim, tak pouzij operator plus:

$druh = array(0 => ' - nerozhoduje - ') + $data;
svobodai
Člen | 136
+
0
-

Tak tohle mne nenapadlo. Zatím jsem tu funkci používal a na tento problém jsem nenarazil. Ale je to tak problém je v tom array_merge. Děkuji za rady.

toka
Člen | 253
+
0
-

Děkuji také… to mne vůbec nenapadlo, resp. nenapadlo mne hledat v manuálové stránce, protože jsem chybu ve funkci nepředpokládal.

repli2dev
Člen | 57
+
0
-

Není to chyba… Jen v PHP existují funkce pro práci s poli, které jsou index safe a které nejsou.

toka
Člen | 253
+
0
-

OK, OK… ne příliš dobře jsem to nazval chybou. Měl jsem napsat, že jsem záludnost v PHP funkci nečekal :-D

svobodai
Člen | 136
+
0
-

Já bych také neřekl, že je to chyba, ona je to prostě vlastnost. A když některé funkce člověk používá automaticky a naposledy o nich četl před několika lety, tak si nevzpomene, že jsou takovéto varianty práce s poly.

David Grudl
Nette Core | 8228
+
0
-

Proto je lepší místo array_merge použít

<?php
$form->addSelect('nacionality', 'Národnost', $enums['nacionality'])->skipFirst(' - nerozhoduje - ');
?>