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. Если мы хотим добавить
дополнительные страницы, нам нужно только написать новые функции для отображения того,
что мы хотим, и еще по одной строке в оператор управления в соответствии с тем, когда эти
страницы должны быть отображены.
[ Содержание ]
[ Вперёд ]
|