Poradie poloziek v selecte

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

Mam select v ktorom chcem vyberat povedzme zoznam rubrik, hierarchicku strukturu. Id-cka v DB nezodpovedaju poradiu, v ktorom to chcem mat v selecte. Existuje nejaky rozumny sposob, ako taketo cosi predat do selectu?
Totiz – ked to tam nacpem ako array( db_id ⇒ item_name ), bude to vo vysledku zle utriedene. Ked to tam nacpem ako utriedene pole, musim riesit logiku prevodu toho, co sa vo formulari vybralo na id vybratej veci v DB. A samozrejme opacne pre defaultne hodnoty. Nejake zazracne riesenia?

Editoval brano (9. 12. 2009 17:43)

brano
Člen | 25
+
0
-

A kedze ziadne neocakavam, pridam aspon dalsiu otazku. Kde je najvhodnejsie robit transformaciu podobneho typu default premennych? Mam komponentu odvodenu od AppForm, do ktorej viacero ludi bude pchat a citat data. Teda sa mi moc nehodi, aby sa kazdy z nich staral o transformaciu dat. Da sa to strcit na nejake jednotne miesto v tom formulari?

blacksun
Člen | 177
+
0
-

Já si tedy myslím, že to funguje přesně tak, jak by mělo, tzn. při předání pole id=>název se v selectboxu zobrazí názvy a po submitu dostaneš IDčko, u multiselectu pole IDček.

K třídění lze použít php funkci asort, která zachovává indexy, viz http://php.net/…on.asort.php

Editoval blacksun (9. 12. 2009 18:09)

brano
Člen | 25
+
0
-

No, ja v zasade netvrdim ze nieco nefunguje tak ako by malo. :) Predstav si taketo pole:

array(
1 ⇒ „Rubrika1“,
2 ⇒ „Rubrika2“,
11 ⇒ „–Podrubrika11“,
12 ⇒ „–Podrubrika12“,
21 ⇒ „–Podrubrika21“,
22 ⇒ „–Podrubrika22“,
)

Zobrazi sa v takomto poradi. Lenze ako pouzivatel by si ocakaval, ze podrubriky budu medzi rubrikami. Da sa to samozrejme jednoducho osetrit tym, ze si spravis nejake pole, co ti bude permutovat indexy, a do selectu budes strkat utriedene tak ako chces, ale uz sa o to musi starat niekto, kto ten komponent pouziva, a to je dost nepohodlne. Takze otazka bola, ci sa to da strcit niekde do formu dnu na nejake rozumne miesto.

Triedenie pochopitelne nic nevyriesi.

blacksun napsal(a):

Já si tedy myslím, že to funguje přesně tak, jak by mělo, tzn. při předání pole id=>název se v selectboxu zobrazí názvy a po submitu dostaneš IDčko, u multiselectu pole IDček.

K třídění lze použít php funkci asort, která zachovává indexy, viz http://php.net/…on.asort.php

blacksun
Člen | 177
+
0
-

Tak pokud bys měl takovéto indexy a chtěl bys řazení 1,11,12,2,21,22, tak např:

<?php

$arr = array(
1 => "Rubrika1",
2 => "Rubrika2",
11 => "-Podrubrika11",
12 => "-Podrubrika12",
21 => "-Podrubrika21",
22 => "-Podrubrika22", );

ksort($arr, SORT_STRING);

?>

array(6) {
1 ⇒ string(8) „Rubrika1“
11 ⇒ string(13) „-Podrubrika11“
12 ⇒ string(13) „-Podrubrika12“
2 ⇒ string(8) „Rubrika2“
21 ⇒ string(13) „-Podrubrika21“
22 ⇒ string(13) „-Podrubrika22“
}

blacksun
Člen | 177
+
0
-

Případně pomocí <optgroup> lze definovat skupiny a pak se předává pole polí, např.

<?php

$arr = array(
	"Rubrika1" => array(,
		11 => "-Podrubrika11",
		12 => "-Podrubrika12",
	),
	"Rubrika2" => array(
		21 => "-Podrubrika21",
		22 => "-Podrubrika22",
	)
);

?>

Bohužel se pak Rubrika1 – název skupiny nedá vybrat jako položka selectboxu.

brano
Člen | 25
+
0
-

Jasne, dik, to ma nenapadlo. Blby priklad. Realne tie indexy nie su taketo pekne, su to uplne nahodne cisla kdesi z DB, takze v praxi sa to pouzit neda. Kazdopadne dik za snahu.

blacksun
Člen | 177
+
0
-

No tak pak nevím, podle jakého klíče je chceš seřadit pro ten selectbox. Pokud to nemá být ručně, je potřeba najít ten systém a ten pak nějak implementovat.

brano
Člen | 25
+
0
-

Bingo! A presne to bola ta otazka. Ze ci na to je vo Form nejaka podpora. Ale to som bol len lenivy lustit kod. Odpove totiz znie – nie je. Ked sa odhodlam prihodit to dnu, urcite sa podelim. Zatim cus.

Ondřej Mirtes
Člen | 1536
+
0
-

Pokud je to jednoduché pole, tak ho můžeš seřadit funkcemi v PHP. Některé podporují i vlastní callback pro porovnávání. Toto se uvnitř třídy Form řešit IMHO nemusí.