By Adam Trachtenberg and David Sklar (8/3/99)
Перевод на русский язык Н.В.Костроминой (30.11.2000 г.).
Многостраничные формы
Таких конструкций в HTML, вообще говоря, не существует. Но, в конце концов,
если мы можем создать форму на одной странице, то почему бы не создать
форму размером в несколько страниц?
К сожалению, протокол HTTP не имеет встроенных механизмов переноса данных
с одной страницы на другую, поскольку в нем не определено понятие
серии страниц. К счастью, с помощью нескольких хитрых трюков и
ряда удобных встроенных функций языка PHP мы можем обойти это ограничение
без больших затруднений. Основная идея очень проста - мы сохраняем
в скрытых переменных все значения, введенные посетителем в поля формы на
предыдущей странице(ах) и используем их затем на последующих страницах.
Таким образом, нужная информация сохраняется при переходе со страницы на
страницу. Реализация этой идеи - самое первое (хотя, возможно, и не самое лучшее)
решение поставленной задачи, но это самый простой способ, и он не требует
использования баз данных или cookies.
Не стоит удивляться тому, что мы расширяем сферу использования переменной
$state, чтобы реализовать новые возможности.
По правде говоря, именно ради этого мы и затеяли всю возню с многостраничными
формами, хотя гораздо проще обрабатывать формы в пределах одной страницы.
Для удобства вернемся к примеру формы, который мы рассматривали выше. Но
на этот раз, нашу страницу с животрепещущими вопросами о любимых сортах
сыра разобьем на две страницы.
В результате мы будем иметь три функции вместо двух. В дополнение
немного изменим их
названия, чтобы они соответствовали изменившемуся содержанию.
Функция display_form() теперь будет называться
display_name().
?>
Она идентична ранее введенной функции за тем исключением, что
мы удалили все вопросы, кроме первого, и изменили название
следующего этапа на "cheese", чтобы дать более точное указание на то,
что будет делаться на следующем этапе.
Далее идет функция display_cheese().
?>
Когда Вы предпочитаете есть сыр:
<INPUT TYPE=HIDDEN NAME="name" VALUE="<?php echo htmlspecialchars($name); ?>">
Этот код вам тоже уже знаком. Тут не никаких неожиданных изменений по
сравнению с предыдущим вариантом. Просто, перед тем как изменить
значение скрытой переменной, используемой для определения этапа
перемещения по нашим страницам, мы еще запоминаем имя и значение
переменной $name, то есть ту часть
информации, которая была получена на предыдущем этапе. При этом мы не
просто напрямую передаем это значение, а пропускаем его через функцию PHP,
которая называется htmlspecialchars().
Стандарт HTML определяет четыре символа, которые не могут использоваться
в других целях, кроме как в тегах для разметки документов :
<, >,
", и &. По этой причине,
для того чтобы убедиться, что мы не поставим браузер пользователя
в затруднительное положение, мы пропускаем $name
через функцию htmlspecialchars(), чтобы некто,
имеющий имя "Bret & Jeff", так и остался "Brett & Jeff."
Теперь, когда передается информация, введенная в эту форму, мы не потеряем ни одной
части этой информации.
В результате этого трюка у нас нет необходимости что-либо менять в функции
process_form(). Мы даже не меняем название функции.
И в операторе, определяющем логику отображения страниц, мы добавляем только одну строку:
Что мы видим? Все, что мы сделали, - добавили elseif
в серединку между двумя предыдущими операторами. В этом прелесть использования
переменной $stage. Если мы хотим добавить
дополнительные страницы, нам нужно только написать новые функции для отображения
того, что мы хотим, и еще по одной строке в оператор управления в соответствии
с тем, когда эти страницы должны быть отображены.
<?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
}
?>
<?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="stage" VALUE="results">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>
<?php
if (empty($stage)) { display_name(); }
elseif ($stage == 'cheese') { display_cheese(); }
else { process_form(); }
?>
David Sklar is the CTO of Student.Net Publishing.
Adam Trachtenberg is the Vice President for Production of Student.Net Publishing.