Обработка данных из HTML-форм при помощи PHP часть 2

С набором радиобаттонов (HTML-элементы input типа radio) все предельно просто. Из группы можно выбрать только один, поэтому и параметр передается один. Хотя, есть случай, когда ни один из элементов не отмечен. Сделаем обработку небольшой HTML-формы:

<?php
 
  if ( count($_GET) > 0 )
  {
      if ( isset($_GET['color']) ) //--Проверяем, был ли передан параметр color
      {
          echo 'Вы выбрали: ';
          switch( $_GET['color'] )
          {
              case 'red': echo 'красный'; break;
              case 'green': echo 'зеленый'; break;
              case 'blue': echo 'синий'; break;
          }
      }
      else
      {
          echo 'Вы ничего не выбрали!';
      }
      exit;
  }
 
?>
 
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <input type="radio" id="red" name="color" value="red" /> <label for="red">Красный</label> <br />
  <input type="radio" id="green" name="color" value="green" /> <label for="green">Зеленый</label> <br />
  <input type="radio" id="blue" name="color" value="blue" /> <label for="blue">Синий</label> <br />
  <input type="submit" name="submit" value="Send" />
</form>

PHP-обработчик умеет определять выбранное пользователем значение, а также отсутствие выбора. Сделаем, чтобы выбор пользователя сохранялся после выполнения запроса (то есть, чтобы выбранный элемент оставался отмеченным). Элемент типа radio генерируется отмеченным, если он имеет атрибут checked со значением checked. Хранить варианты будем в массиве, а генерировать элементы формы динамически с помощью PHP.

<?php
 
  if ( count($_GET) > 0 )
  {
      if ( isset($_GET['color']) ) //--Проверяем, был ли передан параметр color
      {
          echo 'Вы выбрали: ';
          switch( $_GET['color'] )
          {
              case 'red': echo 'красный'; break;
              case 'green': echo 'зеленый'; break;
              case 'blue': echo 'синий'; break;
          }
      }
      else
      {
          echo 'Вы ничего не выбрали!';
      }
      //exit; Отменим завершение, чтобы выводилась форма всегда
  }
 
?>
 
<form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<?php
 
    //--Массив элементов
    $elements = array(
        array('red' => 'Красный'),
        array('green' => 'Зеленый'),
        array('blue' => 'Синий')
    );
 
    foreach($elements as $key => $value)
    {
        //--Если текущий элемент равен выбранному элементу (принятый параметр color), то добавляем элементу формы атрибут checked. Иначе ничего не добавляем
        $checked_attr = ($key == $_GET['color']) ? ' checked="checked"' : '';
        echo '  <input type="radio" id="' . $key . '" name="color" value="' . $key . '"' . $checked_attr . ' />';
        echo ' <label for="' . $key . '">' . $value . '</label><br />'. "\n";
    }
?>
  <input type="submit" name="submit" value="Send" />
</form>

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

Практически точно такой же вариант обработки можно использовать для обработки данных из выпадающего списка. Код я приводить не буду. Кстати, можете самостоятельно адаптировать его. Нужно добавить элемент select, убрать label'ы, элементы типа radio преобразовать в элементы списка option, вместо атрибута checked использовать атрибут selected (информацию о выпадающих списках в HTML можно найти в статье "HTML-формы").

Немного интереснее дело обстоит со списком значений с возможностью множественного выбора. Напомню, что это также HTML-элемент select, но с заданным атрибутом size, определяющим вертикальный размер элемента и multiple, указывающим на возможность выбора более одного элемента. Для такого элемента очень удобен метод, о котором я рассказывал в первой части статьи. Суть в том, что HTTP-параметры, характеризующие выбранные элементы, передаются с одинаковыми именами с символами "[]" на конце. В результате PHP-скрипт, выступающий в роли обработчика формы, получит массив элементов с именем, равным имени этих параметров (без квадратных скобок). Рассмотрим снова пример с выбором съедобных предметов:

<?php
 
  $elements[1] = 'яблоко';
  $elements[2] = 'пирожок';
  $elements[3] = 'камень';
  $elements[4] = 'морковка';
  $elements[5] = 'ножницы';
  $elements[6] = 'огурец';
 
  //--Массив, где будут находиться выбранные пользователем элементы
  $selected_elements = array();
 
  if ( count($_POST) > 0 ) //--Если были приняты данные из HTML-формы. Должны получить массив $_POST['elements']
  {
      echo 'Ваш выбор:</br >';
      foreach($elements as $key => $value) //--Пробегаемся циклом по массиву предметов
      {
          //--Заносим массив $_GET['elements'] в $selected_elements
          $selected_elements = $_POST['elements'];
          //--Проверяем, существует ли каждый из элементов в $selected_elements
          //--Если существует, то элемент был выбран. Не самое оптимальное решение, придумайте вариант элегантнее :)
          if ( in_array($key, $selected_elements) )
              echo $value . '<br />';
      }
  }
 
  echo 'Выберите съедобные предметы (зажмите Ctrl):'. "\n";
  echo '<form method="POST" action="' . $_SERVER['PHP_SELF'] . '">' . "\n";
  echo '  <select name="elements[]" size="8" multiple="multiple">' . "\n";
  foreach($elements as $key => $value) //--Пробегаемся циклом по массиву предметов
  {
      //--Выделяем выбранные ранее элементы при помощи атрибута selected
      //--Процедура схожа, также проверяем, есть ли элемент в списке выбранных
      //--Если есть, то добавляем соответствующему HTML-элементу атрибут selected
      $selected_attr = ( in_array($key, $selected_elements) ) ? ' selected="selected"' : '';
      echo '    <option value="' . $key . '"' . $selected_attr .'>' . $value . '</option>'. "\n";
  }
  echo '  </select><br />' . "\n";
  echo '  <input type="submit" name="submit" value="Готово" />'. "\n";
  echo '</form>'. "\n";
 
?>

В результате при нажатии кнопки "Готово", во-первых, выведется список выбранных элементов, во-вторых, выделенные элементы в списке значений останутся выделенными после выполнения запроса. Не забывайте внимательно изучать HTML-код, который генерирует PHP-скрипт. Возможно, что я где-то допустил ошибку, буду рад если кто-то найдет такое и меня поправит.

Понимаю, что статьи получились несколько перегруженные кодом. Надеюсь, что хоть что-то полезное из них можно будет почерпнуть. С нетерпением жду поры, когда можно будет от теоретических статей переходить на конкретные практические приемы :).

Комментарии

Оставить комментарий »

 
Алексей
23 августа 2012, 0:15
#1
 

Как всегда отличная статья! Только в примере выбора цвета с сохранением введенного значения, при описании массива $elements, нужно чтобы его элементы не были массивами (при данной реализации обработки):

$elements = array(
        'red' => 'Красный',
        'green' => 'Зеленый',
        'blue' => 'Синий'
    );
Joker-jar
23 августа 2012, 9:08
#2
 

Алексей, верное замечание. Иногда смотришь на прошлые труды и понять не можешь, как такие ляпы могли получиться :)

Оставить комментарий

Ваше имя
 
Ваш e-mail
 
Комментарий