Обработка событий checkbox

netstuff

Новичок
Обработка событий checkbox

Здравствуйте камрады.

Хочу побеспокоить вас следующей проблемой.
Стыдно признаться, но у меня определилось серьезное недопонимание того, как обрабатывать чекбоксы.

Что нужно:
1. если checkbox.checked = true, то при получении $_POST данных, соответсвующая перемнная должна быть равна "1";
2. если же checked = false, то приходит "0"

Что имеем:
дефолтное значение (value) каждого из чекбоксов = 1, соответственно, первое условие прекрасно выполняется (выбранный чекбокс передает значение, невыбранный не передается в принципе). трудности возникают тогда, когда надо передать снятое состояние флажка. так как снятый флажок вообще не передается.

Что хотелось бы:
Решить эту проблему стандартными средствами HTML. Подключать JS не очень-то и хочется.
Надеюсь, что у меня всего-лишь недопонимание работы checkbox'а.

Спасибо. Жду.
 

html_coder

Новичок
Ну а в чем проблема, не передалось значение, значит checkbox не установлен.
 

Nutty

Новичок
в форму добавить скрытый элемент с тем же именем что и нужный чекбокс, только со значением 0. если отмечен чекбокс - передастся значение его, если нет - значение скрытого элемента.
 

dimagolov

Новичок
Nutty ну не делайте элементы с одинаковыми именами, что может быть проще?
 

RoLex

Новичок
2netstuff

1. html не обрабатывает форму!
2. ты когда нить просто пробовал вывести например?
<?
print_r($_POST);
?>

посмотри что получается, когда когда чек бокс выбран, и что получается когда он не выбран. думаю, поймешь после этого что делать дальше.
 

netstuff

Новичок
Nutty
пока сделал именно так, но это действительно не совсем граммотно, так как заранее неизвестно, какой броузер как отработает инпуты с одинаковыми именами.

html_coder
проблема в том, что я заранее не знаю количества и имен чекбоксов. и я должен получать массив выделенных и не выделенных элементов. а дальше с ним разбираться...

RoLex
первый раз об этом слышу. а что она делает? посылает на принтер массив $_POST, переведенный на русский язык?

2 ALL
пока решился на такое: создаю скрытый инпут с именем чекбокса+"_check", а в PHP, при приеме $_POST соответсвующим образом обрабатываю. то есть,
Код:
if(isset($_POST["myCheckBox_check"]) && empty($_POST["myCheckBox"])) echo "Чекбокс пуст";
 

RoLex

Новичок
мдаа.. товариСЧ..... :D

ты хоть пробовал написать это? прежде чем писать свой бред.
хотя бы заглянул в ман, что делает ф-ция print_r()?
заглянул в ман, что такое $_POST ?

ну хоть чуть-чуть думай головой :D
 

Nutty

Новичок
netstuff
да хоть 10 переменных с одинаковыми именами...скрипт получит только последнюю из них, поэтому, если флажок установлен, скрытый инпут игнорируется. почитай про формы в хтмл.
 

Viktor_Rez

Новичок
Можно создать одно скрытое текстовое поле, в нём через запятую писать имена всех чекбоксов.

В итоге, у тебя в скрипт придет строка с именами всех чекбоксов. Експлодишь строку по запятым, киляешь последний элемент получившегося массива, ну а дальше isset...
 

Viktor_Rez

Новичок
RoLex, netstuff справедливо спросил:

проблема в том, что я заранее не знаю количества и имен чекбоксов. и я должен получать массив выделенных и не выделенных элементов. а дальше с ним разбираться..

Я написал как получить такой массив, ну а дальше, по его заверениям, он сможет с ним разобраться. =))
 

RoLex

Новичок
Автор оригинала: Viktor_Rez
RoLex, netstuff справедливо спросил:

проблема в том, что я заранее не знаю количества и имен чекбоксов. и я должен получать массив выделенных и не выделенных элементов. а дальше с ним разбираться..

Я написал как получить такой массив, ну а дальше, по его заверениям, он сможет с ним разобраться. =))
из 1го поста автора ясно, что он сам делает страницу - то есть он задает имена элементов страницы.

и их кол-во он может узнать, просто он не знает как, а точнее хочет, чтобы ему сказали - как узнать что-либо на халяву.

думается, что он юзает чей-то скрипт, и не понимает как и что там работает. но хочет его исправить под себя...

всю информацию для размышления ему дали.
 

netstuff

Новичок
Viktor_Rez
как вариант. надо поробовать.

Nutty
почитай про формы в хтмл
ты имеешь в виду спецификацию?
я то что имел в виду: зная, как всевозможные разработчики всеразличных ИЕ игнорируют спецификации, это вносит некоторый элемент риска, что форма будет обработана некорректно. но пока у меня все работает именно так и пока работает =)
 

RoLex

Новичок
Автор оригинала: netstuff
ты имеешь в виду спецификацию?
я то что имел в виду: зная, как всевозможные разработчики всеразличных ИЕ игнорируют спецификации, это вносит некоторый элемент риска, что форма будет обработана некорректно. но пока у меня все работает именно так и пока работает =)
чтобы писать так самоуверенно, нужно хотя бы для начала знать, какие именно части спецификации разные броузеры используют или игнорируют. а ты этого не знаешь. и продолжаешь писать бред, даже не задумываясь над верностью своих домыслов.
 

netstuff

Новичок
Автор оригинала: RoLex
из 1го поста автора ясно, что он сам делает страницу - то есть он задает имена элементов страницы.

и их кол-во он может узнать, просто он не знает как, а точнее хочет, чтобы ему сказали - как узнать что-либо на халяву.

думается, что он юзает чей-то скрипт, и не понимает как и что там работает. но хочет его исправить под себя...

всю информацию для размышления ему дали.
1. а твои страницы кто-то за тебя делает обычно? в моем случае, страница формируется динамически и ни количество, ни имена элементов заранее неизвестны.

2. конечно, их количество я узнать могу. только это не наш метод. насчет халявы - тут с тобой абсолютно соглашусь, дружок. для этого и существует этот ресурс.

3. все что тебе думается не по теме, просьба излагать в своем ЖЖ. и давать ссылку на него своим поклонникам. мне ссылку можешь не присылать...

4. информацию дали. все, кроме тебя. зато ты самоутвердился, сынок =)
 

RoLex

Новичок
мда, потом давай вот таким советы.
ту инфу что тебе написал я, а до этого еще более умные люди, которые и писали мануал для пхп, ты даже не соизволил проверить или узнать, что тебе написали...
"первый раз об этом слышу. а что она делает? посылает на принтер массив $_POST, переведенный на русский язык?"
а это вообще перл дня. топик можно переносить в джоукс.

ну вот ты и сам признался, что все узнать можешь, но не хочешь, а хочешь чтобы все за тебя сделали.
ты даже основ пхп толком не знаешь.
флаг тебе в руки и поезд на встречу.

ЗЫ. 2all сор за этот оффтоп.
 

Vlaeon

Новичок
Мда...
Третировать и унижать человека который знает несколько меньше вас в одной конкретной области и который обратился к вам за помощью прекрасно осознавая, что вы в этой области являетесь бОльшими специалистами чем он - это конечно весьма почетно!
Именно так и должны себя вести настоящие профессионалы! (см. термин "ирония").
Тем не менее проблема остается и я тоже столкнулся с ней буквально несколько часов назад - надо признаться, что тот факт, что я не могу норамально обработать простейший checkbox подействовал на меня несколько обескураживающе... Однако Факт остается Фактом
- checkbox передает обработчику только значения тех полей которые выделены (checked), про остальные поля обработчик просто не знает. Соответственно в массив $_POST который советовали изучить выше, попадают только значения тех checkbox'ов которые были отмечены - те которые отмечены не были и те с которых отметки были сняты (если они раньше были отмечены) в массив не попадают вообще и передать именно их значение (0 в данном случае) не возможно.
И вот ситуация:
Имеем некую базу данных из значений которой PHP генерирует HTML форму, в том числе и группу checkbox'ов количество которых зависит от того, сколько соответствующих значений в эту базу ввели те кто имеет к ней доступ (этих личностей много и они совершенно неуправляемы!).
Задача 1., ("тривиальная"):
отметить те checkbox'ы которые удовлетворяют нашему перманентному представлению о глобальном мировом добре и сохранить в базе данных сведения о том какие именно значения были отмечены.
- В этом случае никаких проблем нет - просто ставим галочки напротив тех значений которые нам больше нравятся и жмем кнопку "сохранить". В массив $_POST нашей формы попадают имена (name) и значения (value) тех элементов которые мы отметили и собрав всю свою волю в кулак , и применив все сокровенные знания о том как разобрать массив $_POST на элементы, мы можем заставить базу данных сохранить невосполнимые сведения о том, что именно те поля одной из её таблиц напротив которых мы поставили галочку, имеют значение "on" (или например "1").
Задача 2., ("неочевидная"):
Под влиянием депрессии вызванной бесконечными семейными ссорами и постоянной нехваткой финансовых ресурсов мы решаем вновь обратиться к той же самой HTML форме (благо скрипт PHP который ее генерирует никуда не делся), и удостовериться в том, что те те checkbox'ы которые мы отметили ранее действительно удовлетворяют нашему представлению о глобальном мировом добре.
- В этом вопросе тоже нет ничего смертельного! Мы, будучи людьми подкованными и побитыми жизьнью, на полчаса излечившись от хронического пивного (мифического) алкоголизма, вполне можем вывести из нашей базы данных все значения которые формируют checkbox'ы так необходимой нам в данный момент HTML формы и присвоить им значение "checked" в случае если в ней, в базе данных, соответствующие поля имеют значение "on" (ну или "1" например). К примеру так:
if($row[2]=='' or $row[2]=='0') {$kl="";}
else {$kl="checked";}
print "<input type=\"checkbox\" name=\"dobro[]\" value=\"$row[0]\" $kl>\n";
Где $row[2] - поля базы в которых должны содержаться значения "on" (ну или "1" например), для полей $row[0] из которых строится группа checkbox'ов в форме, а dobro[] - имя (name) каждого эелемента группы (массива) checkbox'ов.
Если звезды будут к нам благосклонны, то теперь мы сможем лицезреть уже знакомую нам по Задаче 1., форму, в которой выделенные нами в прошлый раз checkbox'ы будут уже отмечены и мы сможем вновь убедиться в тонкости нашего выбора и в тайне возгордиться нашим величием!...
Задача 3., ("нетривиальная"):
Депрессия наша оказалась столь велика, а пропасть отделяющая от возможности благоговейно созерцать результаты собственных трудов многоумных настолько глубока, что нам непременно захотелось изменить значения выделенных нами ранее checkbox'ов, да так, чтобы некоторые из тех которые были до того выделены, вдруг волшебным образом очистились, другие из них так и остались выделенными а многие из тех что не были отмечены нами в свое прошлое посещение данной формы приняли вдруг значение "checked", да еще чтобы так оно всё в базе данных и сохранилось на веки вечные!
- А вот тут и начинается самая интерсная история, благополучного (и оптимального разумеется) разрешения которой ни я, ни _Благословенный Зачинатель Этого Топика Много Лет Назад_ так и не смогли найти на бескрайних просторах всемирной информационной паутины (этот факт особенно странен на фоне того, насколько повседневно выглядит задача и каков фактический возраст злемента "checkbox" как такового).
- Если мы отметим пустующие checkbox'ы в нашей форме, то они благополучно сохрняться в базе данных, по скольку их имена и значения будут явно фигурировать в массиве $_POST и соответственно смогут быть переданы обработчику.
Но, если мы снимем отметку с ранее отмеченных, то ни их имя (name) ни их начение (value) в обработчик не попадет, по скольку они попросту не будут занесены в массив $_POST и их неоткуда будет достать... Таким образом мы не сможем обнулить ранее выбранные значения хранящиеся в базе данных, хотя и сможем добавить к ним новые.
Помня о скудоумии своем, прежде чем пытаться решить столь глобальную проблему, затрагивающую глубинные струны в умах и душах современников своих, своими не достойными упоминания силами, я попытался найти в многочисленных форумах и других доступных источниках хоть приблизительный метод решения хоть приблизительно похожей на описанную здесь проблемы....
Однако судьба не была ко мне благосклонна...
Я нашел массу вопросов практически полностью совпадающих с тем, что был задан здесь автором этой темы и тем, что интересует меня в данный момент, но в ответах фигурировали лишь оскрбления и унизительные констатации и практически ни слова по делу...
В результате мне пришлось наступить на горло здравому смыслу и решить задачу самостоятельно - пусть это криво и не правильно, но оно работает и выдает в итоге нужный результат. Все равно никто из тех кто знает как правильно, не хочет делиться своими Сокровенными Познаниями, так может хоть мой вариант кому то поможет...
- А решение у меня получилось максимально простое:
Вместо того чтобы вычислять какое значение табицы было отмечено а какое обнулено (ведь checkbox передает только два значения - либо "0" либо "1"), мы дделаем два запроса:
1. Очистить всю таблицу. (Не важно отмечены поля - нет, стереть всё!)
2. Вставить в таблицу отмеченные поля. (Они есть в $_POST). И ничего ни с чем сравнивать не нужно и огород из бесконечных циклов городить...
 
Сверху