Конференция "Прочее" » HTML-элемент "checkbox"
 
  • Пробегал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]

    > И все хорошо, если ты знаешь, что такой элемент есть в форме.
    >  А если не знаешь?


    Как такое может получиться ?
  • ProgRAMmer Dimonych © (21.07.08 21:55) [2]
    Если 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: нужно заводить свой массив, в котором хранить единожды обработанные посты.
 
Конференция "Прочее" » HTML-элемент "checkbox"
Есть новые Нет новых   [134439   +49][b:0][p:0.001]