Zilele trecute m-am intalnit cu o situatie inedita. Se da problema: Un formular care printre altele avea cateva campuri de tip checkbox, care erau create dinamic (deci puteau sa varieze ca numar).
Fisierul PHP in care lucram cu datele trebuia sa se uite la fiecare din campurile completate si sa ia devizii in functie de ce a venit de la input. Aici am descoperit o problema pe care, desi are sens, nu am realizat-o pana acum. Checkbox-urile nebifate nu sunt adaugate deloc in $_POST.
De ce se intampla asta? Pai, dupa logica mea este un comportament normal. Avem checkbox-ul:
<input type="checkbox" name="isActive" value="1" />
Respectivul cod, ii spune browser-ului sa randeze un Checkbox, care atunci cand este bifat, sa aiba valoarea “1”. Din pacate, nu exista si un atribut care sa ne spuna valoarea checkbox-ului in stadiul nebifat. Din acest motiv, acesta nu mai ajunge in $_POST.
In mod normal, acest comportament nu pune probleme foarte mari. In cel mai rau caz, ca sa evitam probleme acolo unde validam datele, putem sa folosim un cod de genul:
<?php if(isset($_POST["isActive"])) { // Code goes here } ?>
Dar, asa cum spuneam mai devreme, in acest caz avem de-a face cu checkbox-uri generate dinamic, iar ele trebuiesc verificate indiferent daca sunt bifate sau nu. Am cautat un pic pe internet si am gasit doua abordari la aceasta problema. Prima implica JavaScript si nu am de gand sa o detaliez. In mare, foloseste JavaScript pentru a seta o valoare pentru un checkbox cand e bifat si alta cand nu e.
Mi s-a parut o solutie inutil de laborioasa, asa ca nu am considerat-o viabila. Cea de-a doua, in schimb, mi-a placut. Se foloseste de un alt comportament al input-urilor pe care il banuiam, dar nu l-am cercetat niciodata. Anume, input-urile cu acelasi nume se suprascriu unul pe celalalt. Prin urmare, solutia arata asa:
<input type="hidden" name="isActive" value="0" /> <input type="checkbox" name="isActive" value="1" />
Ce face codul de mai sus? Seteaza un input ascuns care contine valoarea pentru checkbox-ul nebifat. Daca se face submit fara ca checkbox-ul sa fie bifat, in $_POST va ajunge valoarea input-ului de tip hidden. In schimb, daca checkbox-ul este bifat, acesta suprascrie valoarea input-ului ascuns, incarcand $_POST cu valoarea 1.
Tin sa mentionez ca nu sunt 100% multumit de aceasta solutie. Nu mi se pare elegant sa adaugi cate un input ascuns pentru fiecare checkbox, la care ai nevoie de o astfel de validare, dar in lipsa de altceva, este solutia pe care am adoptat-o. Daca mi-a scapat mie ceva si stiti vreo solutie mai buna la aceasta problema, va rog sa-mi dati de stire.