-
Пробегал2.... (21.07.08 21:51) [0]Как известно, есть такой input-элемент checkbox, который на мой взгляд обладает большим недостатком. Дело в том, что если checkbox взведен, то в GET/POST запросе присутствуют данные о нем в виде "name=value". А вот если checkbox не отмечен - то данных о нем в запросе вообще нету ;( На мой взгляд это очень нелогично, можно было бы предусмотреть значения навроде <input type="checkbox" valueEnabled="on" valueDisabled="off" /> и тогда не было бы проблемы ;( Ведь элемент типа "text" если он равняется пустой строчке - отправляет в запросе пустую строчку, хотя по той же логике мог бы ничего не отправлять. И это логично, что он отправляет...
Как обычно обрабатываются такие checkbox'ы? Если заранее известно, что такой checkbox с таким-то именем есть на форуме, то в терминах PHP получается аля:if (isset($checkbox_name)) { $state_checkbox = "on" ; }
else { $state_checkbox = "off" ; }
тут даже не особо важно какое именно значение Value присвоено CheckBox'у. Собственно, нафига оно нужно? Если checkbox активирован - то информация о нем БУДЕТ в запросе, а если не активирован - то не будет...
И все хорошо, если ты знаешь, что такой элемент есть в форме. А если не знаешь?
Допустим, у меня такая ситуация - в базе данных перечислены имена HTML элементов и их значения, которые нужно вывести в форму. В форме их можно изменить и опять сохранить в базу.
До сих пор код сохранения был элементарный донельзя - он просто перебирал существующие в запросе поля данных и сохранял их в базу данных. Это несколько строчек и абсолютно универсальных, можно добавить сколь угодно элементов в форму, все равно он их в цикле все переберет и сохранит. И знать не знает какие конкретно элементы на форме.
И все хорошо, кроме этого CheckBox. Да, если он активирован - то он в запросе присутствует и в базу допустим запишется значение "on" - то, что надо. Но если он не активирован - то его в запросе попросту не будет блин !!! И в базу ничего не запишется, никакого "off" и подобного... Так и останется предыдущее значение...
Многие, знаю, сталкивались с таким поведением, кто-то заменяет checkbox на 2 radio, но это визуально не так удобно ;(
Может, кто обладает элегантным решением проблемы?... -
McSimm © (21.07.08 21:52) [1]
> И все хорошо, если ты знаешь, что такой элемент есть в форме.
> А если не знаешь?
Как такое может получиться ? -
Если checkbox'ф нет, то предполагается какое-то действие по умолчанию. Условие задачи позволяет использовать HIDDEN-поле?
-
Пробегал2.... (21.07.08 23:43) [3]McSimm © (21.07.08 21:52) [1]
> И все хорошо, если ты знаешь, что такой элемент есть в форме.
> А если не знаешь?
Как такое может получиться ?
осталось прочитать всего-то пару абзацев вниз от того места, где ты остановился.
ProgRAMmer Dimonych © (21.07.08 21:55) [2]
Если checkbox'ф нет, то предполагается какое-то действие по умолчанию
ничего не понял - к чему это?
ProgRAMmer Dimonych © (21.07.08 21:55) [2]
Условие задачи позволяет использовать HIDDEN-поле?
позволяет. Но генерировать hidden-поле + JS, который будет в зависимости от нажатий на checkbox присваивать value совсем другому элементу... Ну думал над этим, но криво что-то ;( Вся элегантность решения теряется ;( -
Zeqfreed © (21.07.08 23:52) [4]Ну так элементы то которые ты отображаешь ты берешь из базы? Значит знаешь что это за элементы. Для чекбоксов сделать дополнительное условие не вижу проблемы.
-
McSimm © (22.07.08 00:36) [5]
> осталось прочитать всего-то пару абзацев вниз от того места,
> где ты остановился.
Прочитал. Я не останавливался.
Я о том, что форма делается/генерируется обычно тем же программистом, что и ее обработка. -
Eraser © (22.07.08 00:55) [6]> [0] Пробегал2.... (21.07.08 21:51)
во-первых, следуя этой логике под эту гребенку смело можно отправлять и остальные элементы.
во-вторых, веб-приложение основанное на такой логике (типа заранее не известно что за элементы) кроме как поделкой не назовешь.
это огромная дыра в безопасности, если даже какое-то время все буде нормально, то прийдет в проект новый человек и по незнанию сделает приложение дырявым.
> if (isset($checkbox_name)) { $state_checkbox = "on" ; }
> else { $state_checkbox = "off" ; }
$state_checkbox = isset($_REQUEST['checkbox_name']) ? 'on' : 'off'; -
speller (22.07.08 04:44) [7]Не, всё проще ) Навскидку можно сделать так:
foreach ($dbFields as $field => $fieldData)
{
$value = isset($POST[$field]) ? $POST[$field] : '';
$postFields[$field] = ($fieldData['type'] == 'checkbox' && $value == '') ? 'off' : $value;
}
В результате в массиве $postFields получаем то, что нужно писать в базу. Немного сложнее, но такова жизнь, что не всё так как нам хотелось бы. -
speller (22.07.08 04:51) [8]Кроме того, в таком цикле легко приживаются разного рода проверки на валидность запощенных данных, вроде минимальной/максимальной длины, и т.д., вырезание опасных для базы символов, обрезание html-тегов при необходимости, регэкспы на вырезание ява-скриптов. Например, присвоение $value можно обернуть в mysql_escape_string. Вобщем, на сколько знаний и фантазии хватит ) И вообще, на будущее - не красиво постоянно работать в $POST/$GET: нужно заводить свой массив, в котором хранить единожды обработанные посты.