П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 176898 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 74024 раз(а).

Учебник HTML.
Просмотров 73260 раз(а).

Руководство по PHP5.
Просмотров 44142 раз(а).

Хостинг через призму DNS.
Просмотров 50786 раз(а).

Подборка текстов стандартных документов.
Просмотров 44316 раз(а).

Учебник PHP - Самоучитель
Просмотров 50567 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 50981 раз(а).

Внешние атаки...
Просмотров 41293 раз(а).

Учебник PHP.
Просмотров 36523 раз(а).

SSI в примерах.
Просмотров 27416 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь




Глава 19: СGІ-программирование.
19.7 Другие компоненты формы

Теперь, когда вы знаете, как создавать в форме простые текстовые поля и заполнять их, вам, наверное, интересно будет узнать, как создавать компоненты формы других типов — кнопки, отмечаемые блоки и меню.

Сейчас мы рассмотрим более развитую версию нашей программы. В частности, мы включили в нее новые компоненты формы: всплывающие меню, кнопку передачи (которая называется order) и кнопку очистки полей формы, позволяющую стереть все данные, введенные пользователем. Всплывающие меню делают именно то, о чем говорят их имена, но аргументы, указанные в popup_menu, могут озадачить вас — пока вы не прочитаете следующий раздел, "Ссылки". Функция textfield() создает поле для ввода текста с указанным именем. Подробнее об этой функции мы расскажем ниже, когда будем описывать программу гостевой книги.

#!/usr/local/bin/perl -w
# программа ответа на форму заказа мороженого и генерирования
# этой формы (версия 4)
use strict;

# ввести объявления переменных и выполнить заключение в кавычки 
use CGI qw(:standard);

print header;
print start_html("Ice Cream Stand"), hi("Ice Cream Stand");

if (param()) { # форма уже заполнена
  my $who = param("name");
  my $flavor = param("flavor");
  my $scoops = param("scoops");
  my $taxrate = 1.0743;
  my $cost = sprintf("%.2f", $taxrate * (1.00 + $scoops * 0.25));

  print p("0k, $who, have $scoops scoops of $flavor for \$$cost.");
} else { # первый проход, представить незаполненную форму
  print hr();
  print start_form();
  print p("What's your name? ",textfield("name"));
  print p("What flavor: ", popup_menu("flavor", ['mint','cherry','mocha']));
  print p("How many scoops? ", popup_menu("scoops", [1..3]));
  print p(submit("order"), reset("clear"));
  print end_form(), hr();
}
print end_html;

На рис. 19.4 представлено изображение начальной формы, которую создает рассматриваемая программа.

Рис. 19.4. Более сложная форма

Ice Cream Stand
What's your name? |
What flavor: |t"ii4 How many scoops? 11

Как вы помните, функция param() при вызове ее без аргументов возвращает имена всех полей формы, которые были заполнены. Таким образом вы можете узнать, была ли заполнена форма перед вызовом программы. Если у вас есть параметры, это значит, что пользователь заполнил некоторые поля существующей формы, поэтому на них нужно ответить. В противном случае следует генерировать новую форму с расчетом на вторичный вызов той же самой программы.

Ссылки

Вы, возможно, заметили, что обе функции popup_menu() в предыдущем примере имеют весьма странные аргументы. Что означают [ 'mint', 'cherry' , 'mocha' ] и [ 1. . 3 ] ? Квадратные скобки создают нечто такое, с чем вы раньше не встречались: ссылку на анонимный массив. Это обусловлено тем, что функция popup_menu() в качестве аргумента рассчитывает получить именно ссылку на массив. Другой способ создания ссылки на массив — использовать перед именованным массивом обратную косую черту, например \@choices. Так, следующий фрагмент кода:

@choises = ('mint','cherry','mocha');
print p('What flavor: ", popup_menu ("flavor", \@choises));

работает так же хорошо, как этот:

print pC'What flavor: ", popup_menu ("flavor", ['mint','cherry','mocha']));

Ссылки функционируют примерно так, как указатели в других языках, но с меньшей вероятностью появления ошибок. Они представляют собой значения, которые указывают на другие значения (или переменные). Ссылки Perl строго делятся на типы (без возможности приведения типов) и никогда не вызывают вывода дампов ядра операционной системы. Более того, если область памяти, на которую указывают ссылки, больше не используется, она автоматически возвращается в использование. Ссылки'играют центральную роль в объектно-ориентированном программировании. Они применяются и в традиционном программировании, являясь основой для создания структур данных, более сложных, нежели простые одномерные массивы и хеши. Язык Perl поддерживает ссылки как на именованные, так и на анонимные скаляры, массивы, хеши и функции.

Также, как методом \@массив можно создавать ссылки на именованные массивы и посредством указания [ список ] — на анонимные хеши, можно методом \%хеш создавать ссылки на именованные хеши, а методом (ключ1, значение1, ключ2, значение2, ... ) — на анонимные*.

Да, фигурные скобки теперь используются в Perl с различными целями. Их функцию определяет контекст, в котором используются фигурные скобки.

Подробнее о ссылках вы прочитаете в главе 4 книги Programming Perl и на man-странице perlref(l).

Более сложные вызывающие последовательности

Мы закончим наш рассказ о компонентах форм созданием одного очень полезного компонента, который позволяет пользователю выбирать любое число элементов этого компонента. Функция scrolling_list() модуля CGI.pm может принимать произвольное число пар аргументов, каждая из которых состоит из именованного параметра (начинающегося со знака -) и значения этого параметра.

Чтобы ввести в форму прокручиваемый список, нужно сделать следующее:

print scrolling_list(
    -NAME => "flavors",
    -VALUES => [ qw(mint chocolate cherry vanilla peach) ],
    -LABELS => {
      mint => "Mighty Mint",
      chocolate => "Cherished Chocolate",
      cherry => "Cherry Cherry",
      vanilla => "Very Vanilla",
      peach => "Perfectly Peachy",
    },
    -SIZE =>3,
    -MULTIPLE => 1, #1 for true , 0 for false

Значения параметров имеют следующий смысл:

  • -NAME - Имя компонента формы. Значение этого параметра можно использовать позже для выборки пользовательских данных из формы с помощью функции param().
  • -LABELS - Ссылка на анонимный хеш. Значения хеша — это метки (элементы списка), которые видит пользователь формы. Когда пользователь выбирает ту или иную метку, в CGI-программу возвращается соответствующий ключ хеша. Например, если пользователь выбирает элемент, заданный как Perfectly Peachy, CGI-программа получает аргумент peach.
  • -VALUES - Ссылка на анонимный массив. Этот массив состоит из ключей хеша, на которые ссылается -labels.
  • -SIZE - Число, определяющее, сколько элементов списка пользователь будет видеть одновременно.
  • -MULTIPLE - Истинное или ложное значение (в том смысле, который принят для этих понятий в Perl), показывающее, можно ли будет пользователю формы выбирать более одного элемента списка.

Если -multiple установлена в значение "истина", вы можете присвоить список, возвращаемый функцией param(), массиву:

@choices = param("flavors");

Вот другой способ создания этого прокручиваемого списка — с передачей ссылки на существующий хеш вместо создания такого хеша "на ходу":

%flavors = (
  "mint", "Mighty Mint",
  "chocolate", "Cherished Chocolate",
  "cherry", "Cherry Cherry",
  "vanilla", "Very Vanilla",
  "peach", "Perfectly Peachy",
);

print scrolling list(
  -NAME => "flavors",
  -LABELS => \%flavors,
  -VALUES => [ keys %flavors ],
  -SIZE => 3,
  -MULTIPLE => 1, #1 for true , 0 for false
);

На этот раз мы передаем в функцию значения, вычисленные по ключам хеша %flavors, ссылка на который выполняется с помощью операции \, Обратите внимание: параметр -values здесь тоже взят в квадратные скобки. Простая передача результата операции keys в виде списка не сработает, потому что в соответствии с правилом вызова функции scrolling_list() должна быть сделана ссылка на массив, которую как раз и создают квадратные скобки. Считайте квадратные скобки удобным способом представления нескольких значений как одного.

Назад | Вперед
Содержание (общее) | Содержание раздела



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru