Autor | Zpráva | ||
---|---|---|---|
jaspys Profil |
#1 · Zasláno: 9. 12. 2011, 19:40:26
Zdravím. Mám problém jak zkombinovat dva způsoby zpracování checkboxů ve formuláři. Z tadabáze vypisuji řádky záznamů a ke každému přiřadím jeden checkbox
<input type="checkbox" name="oznaceno" value="'.$radek.'">Označit
Poté na konec přiřadím jeden, kterým vše označuji i odznačuji <input type="checkbox" name="CheckAll" onclick="checkAll(document.vysledky.CheckAll, document.vysledky.oznaceno)">Označit vše
volám na to funkci function checkAll(CheckAll,field) { if(CheckAll.checked == true) for (i = 0; i < field.length; i++) field[i].checked = true ; else for (i = 0; i < field.length; i++) field[i].checked = false ; } Pokud si určité řádky označím a pak je chci předat metodou POST do dalšího okna (kde to zpracuji) a chci zjistit jaké checkboxi byli zatrhlé, tak v $_POST["oznaceno"] je hodnota pouze posledního checkboxu. Pokud je budu ale číslovat, tak mi zase nejde to hromadné označení.
Nesetkali jste se prosím někdo s podobným problémem? Nic vhodného jsem na netu k tomu nenašel... |
||
Alphard Profil |
#2 · Zasláno: 9. 12. 2011, 20:00:58
Setkali. Name zapište jako pole, klíčem nechť je ideálně id záznamu.
|
||
jaspys Profil |
#3 · Zasláno: 9. 12. 2011, 20:25:20
ale jak pak právě zapsat tu funkci pro označování checkAll? To se mi s polem nepodařilo rozchodit
|
||
Alphard Profil |
#4 · Zasláno: 9. 12. 2011, 20:40:04
Tady je sekce PHP, nevím, jestli to js umí nějak vhodně řešit jen na základě nějaké iterace nad name. Ale určitě je možné najít patřičné prvky na základě třídy, pozice v DOMu a podobně.
Jestli chcete, přesunu to do kategorie javascriptu. |
||
jaspys Profil |
#5 · Zasláno: 9. 12. 2011, 20:43:51
ok, díky za přesunutí
|
||
Chamurappi Profil |
#6 · Zasláno: 10. 12. 2011, 12:27:58
Reaguji na jaspyse:
Z hlediska HTML a DOMu hranaté závorky v name vůbec nic neznamenají, různá name se berou jako různá name . Můžeš si sestavovat postupně jednotlivé názvy políček jako řetězec ve formátu "oznaceno[" + i + "]" a projet všechny i , dokud nenarazíš na neexistující prvek.
Reaguji na Alpharda: „určitě je možné najít patřičné prvky na základě třídy“ Neefektivní, navíc musíš řešit nekompatibility prohlížečů. Hierarchie jmen je mnohem pohodlnější. „Name zapište jako pole“ Neexistuje v PHP nějaký snadný způsob, jak se dostat k hodnotám se stejným name ? Na server se totiž normálně odesílají. (Jiné jazyky to většinou umí.)
Co by se dělo, kdyby se použilo několikanásobně name="oznaceno[]" , tj. bez konkrétního indexu? Nevzniklo by v PHP pole?
|
||
jenikkozak Profil |
#7 · Zasláno: 11. 12. 2011, 11:19:45
Chamurappi:
Nikdo zkušenější neodpověděl, a tak se osměluji. :-) „Co by se dělo, kdyby se použilo několikanásobně name="oznaceno[]", tj. bez konkrétního indexu? Nevzniklo by v PHP pole?“ PHP vytváří při při příjmu dat z formuláře superglobální proměnnou - asociativní pole _POST (při použití metody post). Při tom se rozsekají data z postu, parametry a hodnoty (neznám terminologii HTTP požadavků) se použijí jako klíč a hodnota tohoto pole. (Tedy atribut name z položky formuláře se stane klíčem pole.) Tento proces je ale tak naivní, že položky pole se stejným klíčem se bezstarostně přepíšou. Použije-li se několikanásobně name="oznaceno[]" , tedy name končící na "[] ", vznikne v poli _POST indexované pole. (Indexem je pořadí, ve kterém parametry dorazí.)
Také je dobré myslet na to, že PHP nehledí na typy proměnných. Budu-li ale mít ve formuláři 3 name a první budou připravené pro indexované pole ( oznaceno[] , oznaceno[] a oznaceno ), z těch prvních sice vznikne indexované pole se dvěma hodnotami, ale přepíše se třetí hodnotou, která bude pouze položkou pole _POST (takže v tomto poli bude jen jedna položka). Přijdou-li parametry v pořadí oznaceno[] , oznaceno , oznaceno[] , pak v PHP vznikne v _POST indexované pole, přepíše se na položku _POST, která se přepíše na indexované pole. (Takže v poli _POST bude indexované pole s jedinou položkou.)
Index v indexovaném poli se dá určit pomocí čísla v hranatých závorkách atributu name položky formuláře. (Např. oznaceno[3] .) Při tvorbě pole _POST však nezáleží na indexech, ale na pořadí, ve kterém parametry přijdou. Z parametrů v pořadí oznaceno[3] , oznaceno , oznaceno[2] přežije jen poslední, ačkoliv má index nižší než oznaceno[3] .
Stejným způsobem vzniká také pole _GET při použití metody get. V takovémto případě se dá (méně pohodlnější cestou, ale přesto velice snadno) vytáhnout z superglobální _SERVER celý seznam parametrů a hodnot, rozřezat se na jednotlivé části a nakládat s ním podle libosti. U metody post je situace komplikovanější v tom, že se tento seznam v superglobální _SERVER nenachází. (Sehnat se jistě dá, ale ani nevím kde.) Pokud se tedy počítá s tím, že bude formulář posílán PHP skriptu, je lepší použít různá name nebo name končící na dvojici hranatých závorek. Jinak autor přijde celý smutný do kategorie PHP a bude zkoumat, co si má počít, a stejně mu někdo poradí, aby atributy v HTML přepsal. |
||
Tori Profil |
#8 · Zasláno: 11. 12. 2011, 13:35:56
jenikkozak:
„Sehnat se jistě dá, ale ani nevím kde.)“ Spolehlivě se dá číst z php://input: urldecode(file_get_contents('php://input')); , pak explodovat podle & (parse_str() se nedá použít, dochází k přepisování jako v $_POST). Pak ještě v závislosti na nastavení i z $HTTP_RAW_POST_DATA (taky jako řetězec).
|
||
Časová prodleva: 12 let
|
0