Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Введение в PHP. Многостраничные формы

By Adam Trachtenberg and David Sklar  (8/3/99)
Перевод на русский язык Н.В.Костроминой (30.11.2000 г.).

Многостраничные формы

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

К сожалению, протокол HTTP не имеет встроенных механизмов переноса данных с одной страницы на другую, поскольку в нем не определено понятие серии страниц. К счастью, с помощью нескольких хитрых трюков и ряда удобных встроенных функций языка PHP мы можем обойти это ограничение без больших затруднений. Основная идея очень проста - мы сохраняем в скрытых переменных все значения, введенные посетителем в поля формы на предыдущей странице(ах) и используем их затем на последующих страницах. Таким образом, нужная информация сохраняется при переходе со страницы на страницу. Реализация этой идеи - самое первое (хотя, возможно, и не самое лучшее) решение поставленной задачи, но это самый простой способ, и он не требует использования баз данных или cookies.

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

Для удобства вернемся к примеру формы, который мы рассматривали выше. Но на этот раз, нашу страницу с животрепещущими вопросами о любимых сортах сыра разобьем на две страницы.

В результате мы будем иметь три функции вместо двух. В дополнение немного изменим их названия, чтобы они соответствовали изменившемуся содержанию. Функция display_form() теперь будет называться display_name().

<?php
function display_name() {
 global $PHP_SELF;

?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Name: <INPUT TYPE=TEXT NAME="name"><BR>
<INPUT TYPE=HIDDEN NAME="stage" VALUE="cheese">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>

Она идентична ранее введенной функции за тем исключением, что мы удалили все вопросы, кроме первого, и изменили название следующего этапа на "cheese", чтобы дать более точное указание на то, что будет делаться на следующем этапе.

Далее идет функция display_cheese().

<?php
function display_cheese() {
  global $PHP_SELF;
  global $name;

?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Ваш любимый сорт сыра:
                 <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie
                 <INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar
                 <INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella

Когда Вы предпочитаете есть сыр:
                 <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">на завтрак
                 <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">на обед
                 <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">на ужин
                 <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">поздно ночью

<INPUT TYPE=HIDDEN NAME="name" VALUE="<?php echo htmlspecialchars($name); ?>">
<INPUT TYPE=HIDDEN NAME="stage" VALUE="results">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>

Этот код вам тоже уже знаком. Тут не никаких неожиданных изменений по сравнению с предыдущим вариантом. Просто, перед тем как изменить значение скрытой переменной, используемой для определения этапа перемещения по нашим страницам, мы еще запоминаем имя и значение переменной $name, то есть ту часть информации, которая была получена на предыдущем этапе. При этом мы не просто напрямую передаем это значение, а пропускаем его через функцию PHP, которая называется htmlspecialchars(). Стандарт HTML определяет четыре символа, которые не могут использоваться в других целях, кроме как в тегах для разметки документов : <, >, ", и &. По этой причине, для того чтобы убедиться, что мы не поставим браузер пользователя в затруднительное положение, мы пропускаем $name через функцию htmlspecialchars(), чтобы некто, имеющий имя "Bret & Jeff", так и остался "Brett & Jeff."

Теперь, когда передается информация, введенная в эту форму, мы не потеряем ни одной части этой информации.

В результате этого трюка у нас нет необходимости что-либо менять в функции process_form(). Мы даже не меняем название функции. И в операторе, определяющем логику отображения страниц, мы добавляем только одну строку:

<?php
if (empty($stage)) { display_name(); }
elseif ($stage == 'cheese') { display_cheese(); }
else { process_form(); }
?>

Что мы видим? Все, что мы сделали, - добавили elseif в серединку между двумя предыдущими операторами. В этом прелесть использования переменной $stage. Если мы хотим добавить дополнительные страницы, нам нужно только написать новые функции для отображения того, что мы хотим, и еще по одной строке в оператор управления в соответствии с тем, когда эти страницы должны быть отображены.

К началу страницы Cookies


David Sklar is the CTO of Student.Net Publishing.
Adam Trachtenberg is the Vice President for Production of Student.Net Publishing.