Autor Zpráva
jaspys
Profil
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
Setkali. Name zapište jako pole, klíčem nechť je ideálně id záznamu.
jaspys
Profil
ale jak pak právě zapsat tu funkci pro označování checkAll? To se mi s polem nepodařilo rozchodit
Alphard
Profil
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
ok, díky za přesunutí
Chamurappi
Profil
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
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
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).

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0