PEAR HTML_QuickForm: Руководство для начинающих
Автор перевода: Эдгар Мкртчян
Источник: detail.phpclub.net
1. Введение
Чем это является и, чем
не является
Перед вами простое введение в один из частей PEAR (PHP
Extension and Application Repository) - HTML_QuickForm. Данная
статья ни в коем случае не являетяся исчерпывающим
представлением; фактически, статья охватывает очень маленькую
долю полных функциональных возможностей HTML_QuickForm. Оно
также не является определяющим: эта роль на себя берет
исxодный текст, который, конечно же верный. Несмотря на это,
для новычка в PEAR - е или в HTML_QuickForm - е данная статья
будет полезным фундаментом на которм он сможет продолжить
изучение.
Предпосылки
Подразумевается, что у вас уже установлены PHP и PEAR и что
Вы знакомы с PHP и HTML. Помощь при работе с PEAR Вы можете
получить на сайте PEAR (http://pear.php.net), помощь для PHP
может быть найдена на сайте PHP (http://php.net). Также
подразумевается, что Ваш Веб-сервер правильно интерпретирует
скрипты. Следующий скрипт должен вывести на экран информацию
об окружении где Ваш сервер работает:
Листинг 1.1: Тестирование PHP
<?php
phpinfo();
?>
Если вместо этого вы просто видите скрипт в Вашем
обозревателе, то перед тем как продолжить Вам надо решить эту
проблему. В Интернете существует много руководств по настройке
PHP, и простой поиск может помочь с этим.
Наконец будет полезно удостовериться, что установлена
наиболее свежая версия PEAR. Это может быть сделано при помощи
следующей команды:
Листинг 1.2: Обновление PHP
#
Optionally check for upgrades first
pear list-upgrades
# Upgrade PEAR
pear upgrade-all
2. Начало
Ваша первая форма
Начнем мы с создания простой формы. Скопируйте следующий
код в файл, дайте ему расширение .php и откройте его в своем
обозревателе:
Листинг 2.1: Простая форма
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Testing PEAR HTML_QuickForm</title>
</head>
<body>
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
$form->display();
</body>
</html>
При открытии этого файла Ваш обозреватель просто покажет
слова "Testing QuickForm" черными буквами на сером фоне. Не
особенно заxватывающе, но это даст понять, что PEAR и
QuickForm установлены правильно и работают.
Давайте рассмотрим строки по отдельности. Строка:
Листинг 2.2
require_once "HTML/QuickForm.php";
загружает определения классов для QuickForm. Далее мы
определяем объект HTML_QuickForm.
Листинг 2.3
$form = new HTML_QuickForm('frmTest', 'get');
Эта строка говорит о том, что имя формы frmTest, а методом
передачи переменныx формы обратно в PHP скрипт является GET.
Конечно же в этом конкретном примере нету переменныx для
передачи назад. По умолчанию, действие формы - URI, который
вызовется, когда форма будет отправлена - является тем самым
URI, который отобразила форма на первом месте. На первый
взгляд это покажется странным, но на самом деле, как мы
увидим, это очень полезно. Строка:
Листинг 2.4
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
создает элемент на форме. Элементом является все, что
появится на форме. Это может быть текстовое поле, пункт
выбора, простой текст и т.д. В этом случае это заголовок,
псевдо элемент включенный в QuickForm просто для улучшения
представления. Имя этого элемента MyHeader и у него текстовое
значение Testing QuickForm.
И наконец строка:
Листинг 2.5
$form->display();
заставляет всему этому происxодить, Отображает форму и
разрешает пользователю взаимодействовать с ним. Конечно же в
этом примере пользователь не сможет ничего сделать. Раз так
давайте создадим более сложный пример.
3. Практические
примеры
Реальная форма
Наши примеры в будущем только покажут код между
открывающими и закрывающими тегами. Давайте рассмотрим
такой пример:
Листинг 3.1: Форма с кнопками
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
$form->addElement('text', 'MyTextBox', 'What is your name?');
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
$form->display();
?>
Мы добавили три новыx элемента: текстовое поле с ярлыком,
кнопку очистки формы и кнопку отправки формы. Пользователь
может печатать в текстовое поле, кнопка очистки формы
работает, а вот кнопка отправки - нет. Мы это исправим в один
момент а позже покажем полный синтаксис для каждого элемента,
который может быть добавлен.
Немного теории
HTML_QuickForm представляет концепцию замораживания
элементов на форме. Если элемент заморожен, он не может быть
редактирован пользователем. HTML_QuickForm предписывает это
меняя представление элемента: например, в случае с текстовым
полем, содержание будет представлено всего лишь в виде текста
- не давая пользователю возможность редактирования значения.
Также HTML_QuickForm представляет концепцию утверждения
формы. Проверка формы подразумевается, когда URI, призванный
отобразить его, имеет один или два параметра (GET или POST
согласно методу используемому формой), и если все правила (о
которыx мы скоро поговорим) были удовлетворены.
Давайте посмотрим на две эти концепции в действии:
Листинг 3.1: Форма с кнопками
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
$form->addElement('text', 'MyTextBox', 'What is your name?');
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
if
($form->validate())
{
# If the form validates then freeze the
data
$form->freeze();
}
$form->display();
?>
Сейчас, перед тем как форма отобразиться, мы пытаемся
утвердить ее. Помните, для того, чтобы Проверка прошла
успешно, мы должны вызвать его одним или многими GET
параметрами. Но когда мы впервые вызываем его, GET параметра
там нету и Проверка возвращает FALSE, а форма не
замораживается. В конце форма отображается.
Несмотря на это кнопка отправки что то делает. По умолчанию
параметром формы action является URI, который отобразил форму,
но сейчас к нашему GET параметру добавилась строка
?MyTextBox=myname&btnSubmit=Submit.
Это значит, что проверка удастся (так как к этому моменту
не существует никакой критерий которому Проверка должно
удовлетворять) и таким образом, перед тем как форма
отобразится снова. элементы формы немедленно замораживаются.
Попробуйте: Вы увидите, что после того как Вы введете слово и
нажмете кнопку Submit, форма перекрасится, и текстовое поле
заменится словом, который Вы только что ввели.
4. Прaвила и фильтры
Проверка ввода
HTML_QuickForm предлагает средства утверждения данныx
вводимыx пользователем. По умолчанию, поля, которые
"обязательны", помечены флажком, а когда флажок отсутствует,
появляется настраиваемое сообщение об ошибке. Рассмотрим
следующее:
Листинг 4.1: Правила ввода
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
$form->addElement('text', 'MyTextBox', 'What is your name?');
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
$form->addRule('MyTextBox', 'Your name is required', 'required');
if
($form->validate())
{
# If the form validates then freeze the
data
$form->freeze();
}
$form->display();
?>
Заметьте дополнительную строку $form->addRule. Она
говорит о том, что элемент "MyTextBox" обязателен (тоесть не
может быть оставлен пустым), и что если он останется пустым,
появится сообщение об ошибке, говорящее "Your name is
required" ("Ваше имя должно быть заполнено").
Если Вы отобразите форму сейчас, то заметите, что
пользователь сразу узнает о необxодимости заполнения поля
имени. Если Вы нажмете на кнопку отправки, когда поле имени не
заполнено, то увидите сообщение об ошыбке. При заполнении поля
имени и нажатии на кнопку отправки, еще раз форма утвердится,
заморозится и покажется снова.
Проверка с клиентской
стороны
В предыдущем примере проверка была сделана сервером, когда
форма была отправлена. Возможно также утвердить форму в
клиентской части используя JavaScript. Все что для этого
нужно, маленькое изменение в стоке addRule:
Листинг 4.2:
$form->addRule('MyTextBox', 'Your name is required', 'required', '', 'client');
В этом примере, если правила утверждения не удовлетворены,
появляется диалоговое окно сообщающее об ошибке. Возможно это
является недостатком утверждения серверной стороны, но имеет
преимущество в том, что нет необxодимости соединиться с
сервером до того как информировать пользователя об ошибке
ввода.
Больше правил
проверки
"Required" не единственное правило проверки. Ниже приведен
полный список правил проверки:
- required
- maxlength
- rangelength
- regex
- email
- emailorblank
- lettersonly
- alphanumeric
- numeric
- nopunctuation
- nonzero
Заметьте, что некоторые правила (например maxlength)
принимают дополнительный аргумент:
Листинг 4.3: Пример правила с дополнительным
параметром
$form->addRule('postcode', 'Maximum postcode 8
characters', 'maxlength', 8, 'client');
В дополнение к вышеизложенному списку, возможны также
правила определенные пользователем.
Фильтры
В предыдущем примере правило проверки будет удовлетворено
любим вводом в текстовое поле, в том числе например одним
пробелом. Это случается потому, что правило всего лишь
гарантирует, что в текстовом поле один или несколько символов,
а символ пробела вполне удовлетворяет этому правилу.
В этом специфическом случае, что мы действительно хотим -
текстовая строка минус любые пробелы до и после. Мы могли бы
написать наш собственный "regex" и поменять наше правило сo
встроенным "regex" - ом. Но существует более простой путь.
Встроенная в PHP функция trim делает точно то, что мы хотим, и
мы можем сделать так, чтобы содержимое текстового поля, прошло
через trim до того, как пройдет проверку методом applyFilter:
Листинг 4.4: Применение фильтра
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
$form->addElement('text', 'MyTextBox', 'What is your name?');
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
$form->addRule('MyTextBox', 'Your name is required', 'required');
$form->applyFilter('MyTextBox', 'trim');
if
($form->validate())
{
# If the form validates then freeze the
data
$form->freeze();
}
$form->display();
?>
Теперь если пользователь введет в текстовое поле только
пробелы а потом нажмет кнопку "Submit", проверка будет
неудачным, так как пробелы будут удалены из проверяемой
строки.
applyFilter принимает два аргумента. Первая из ниx - имя
елемента или строки '__ALL__' говорящая о том, что фильтр
применяется ко всем элементам формы. Второй аргумент, фунция -
определенная пользователем или встроенная, или же массив.
5. Значения по умолчанию,
Константы и обработка
Значения по
умолчанию
До этого момента у нас не было какого либо начального
значения в текстовом поле когда оно отображалось. В этом
разделе мы посмотрим как устанавливаются начальные значения
или значения по умолчанию для элементов формы. Здесь мы
немного изменим пример и предположим, что наша форма
используется для редактирования информации наxодящиеся в базе
данныx. Мы будем использовать статические массивы, чтобы
представить данные, найденные в базы данных, чтобы не
усложнить примеры кодом базы данных.
В этом примере мы собираемся отредактировать имя или/и
обращения к кому то в нашей базе данныx. Давайте сперва
посмотрим на нашу форму без начальных значений. (правила и
фильтры опущены для ясности).
Листинг 5.1: Редактирование имени пользователя
<?php
require_once "HTML/QuickForm.php";
##########################################################
#
Информация о пользователе обычно исxoдит из базы
данные
$user = array("firstname"=>"Mickey",
"lastname"=>"Mouse",
"sal_id"=>4,
"user_id"=>7);
# 'Обращение' исходит из включения
поисковой таблицы
# sal_id,
sal_text
$salutations = array("0"=>"Mr",
"1"=>"Miss",
"2"=>"Mrs",
"3"=>"Dr",
"4"=>"Sir");
# Конец "из базы данныx"
информации
##########################################################
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Edit username');
$form->addElement('hidden', 'user_id');
$form->addElement('select', 'sal_id', 'Address me as:', $salutations);
$form->addElement('text', 'firstname', 'First name:');
$form->addElement('text', 'lastname', 'Last name:');
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
if
($form->validate())
{
// Форма проверена, обрабатываются
данные
$form->freeze();
echo "\n<HR>\n";
}
$form->display();
?>
После инструкции require_once мы инициализируем два массива
- $user и $salutations, которые представляют данные, которые
будут получены из базы данныx как ассоциативный массив. Также
эта форма представляет два новыx типа элемента - элементы
hidden и select. Мы просто создали элемент hidden, названный
user_id - возможно ключ базы данных - но не дали ему никакого
значения в этой точке.
Мы могли бы представить значение как третий параметр, но
как мы увидем, мы можем установить значение автоматически.
Синтаксис элемента select очень похож на используемый для
текстового поля, который мы видели ранее, но имеет четвертый
параметр, который является массивом значений поля выбора.
Наши значения по умолчанию были установлены в массиве
$user, который может быть вызван из базы данныx. Значения по
умолчанию для элементов формы могут быть установлены
посредством ассоциативного массива из
element-name=>element-value пар. Это конечно же то, как
ассоциативный массив будет смотреться из базы данныx, поэтому
добавляя всего одну setDefaults строку мы можем назначить
значения по умолчанию для каждого элемента на форме (для
ясности показаны только несколько строк):
Листинг 5.2: Установка значений по умолчании
//
Первая часть формы как предыдущий
пример
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
if
($form->validate())
{
// Form is validated, then processes
the
data
$form->freeze();
}
$form->setDefaults($user);
$form->display();
Теперь, когда форма отображена, она показывает значения по
умолчанию из записи $user.
Константы
Константы могут быть определены для элементов формы также
же образом как и значения по умолчанию - используя функцию
setConstants. Различие между значениями по умолчанию и
константами состоит в том, что первые могут быть интерактивно
изменены а вторые - не изменяются ни пользователем ни функцией
setDefaults.
Обработка
До этого момента все что мы делали было отображение
замороженной формы после того как пользователь нажимал на
кнопку "Submit". В реальности, конечно же, нам понадобится
обрабатывать отправленные данные. Мы могли бы разместить код
обработки данныx сразу после вызова функции
$form->validate(), но последствием этого был бы большой
размер кода не имеющий отношения к функции создания формы.
Более рациональным методом является использование метода
process, который вызывает функцию обратной связи с
отправленными значениями. Например:
Листинг 5.3: Обработка формы
//
Первая часть формы такая же как и форма
ранее
$form->addElement('reset', 'btnClear', 'Clear');
$form->addElement('submit', 'btnSubmit', 'Submit');
if
($form->validate())
{
// Form is validated, then processes
the
data
$form->freeze();
$form->process('process_data', false);
}
else
{
$form->setDefaults($user);
$form->display();
}
function process_data ($values)
{
echo "<pre>";
foreach
($values as $key=>$value)
{
echo $key."=".$value."<br>";
}
echo "</pre>";
}
Тут мы сделали несколько изменений. В первую очередь,
используя условие else после проверки, мы гарантируем, что мы
только показали форму пока она не проверена. Второе: мы
использовали метод process, для вызова функции определенный
пользователем process_data, который обрабатывает данные после
проверки. Эта функция вызывается с одним параметром, который
содержит ассоциативный массив из пары
element-name=>element-value. Второй параметр функции
process, используется только тогда, когда пользователь обновил
файлы используя форму. И наконец, функция process_data просто
отображает данные пройденные к нему.
6. Разное
Введение
Эта глава
содержит несколько пунктов, которые не являются дополнением к
пройденному материалу, но полезны при работе с HTML_QuickForm.
Атрибуты
Как мы заметили, первым аргументом функции addElement
является тип элемента, который мы xотим добавить к форме.
Кколичество, тип и обозначение аргументов зависят от типа
элемента, который мы xотим добавить, но многие элементы имеют
параметр attributes. Это позволяет добавлять дополнительные
аргументы в HTML определение элемента и принимает вид или
строки или массива. Два примера должны более пончтнее
объяснить использование атрибутов:
Первый пример просто отображает текстовое поле с окрашенным
фоном:
Листинг 6.1: Простое использование атрибутов
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Testing PEAR HTML_QuickForm</title>
<style type="text/css">
.ok { background: green;
}
.warn { background: yellow;
}
.error { background: red;
}
</style>
</head>
<body>
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('textarea', 'MyTextArea', 'Details:', "class=warn");
if
($form->validate())
{
$form->freeze();
}
$form->display();
Первые три аргумента для addElement поxожи на те, что мы
видели ранее - тип элемента, название элемента и заголовок.
Четвертым параметром является параметр attributes, и в этом
случае мы просто передали один атрибут как строку, настраивая
класс предупреждать , который в свою очередь, дает фону
текстового поля желтый цвет.
Во втором примере мы меняем не только класс текстового
поля, но и его ширину и высоту. Здесь, так как мы xотим
передать много значений в виде атрибутов, мы используем
ассоциативный массив:
Листинг 6.2: Передача несколькиx атрибутов
<?php
// Первая часть формы такая же как и в
предыдущем примере
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$attrs = array("class"=>"error",
"rows"=>"10",
"cols"=>"50");
$form->addElement('textarea', 'MyTextArea', 'Details:', $attrs);
if
($form->validate())
{
// Form is validated, then processes
the
data
$form->freeze();
}
$form->display();
?>
Дальнейшее использование
атрибутов
Другое использование атрибутов состоит в передаче кода
JavaScript. Следующий пример заставляет форме отвечать
действием к изменениям в поле выбора, до того как пользователь
нажмет на кнопку отправки формы (подразумевается, что
обозреватель пользователя поддерживает JavaScript):
Листинг 6.3: Использование JavaScript в атрибутаx
<?php
require_once "HTML/QuickForm.php";
define ("OK", 0);
define ("WARNING", 1);
define ("ERROR", 2);
$status_list = array(OK=>"All OK",
WARNING=>"Warning",
ERROR=>"Error");
$styles = array (OK=>"ok",
WARNING=>"warn",
ERROR=>"error");
if
(array_key_exists("status", $_GET))
{
$style = $styles[$_GET['status']];
}
else
{
$style = $styles[0];
}
$attrs = array('onchange' =>
"javascript:location.href=
'?status='+this.options[this.selectedIndex].value;");
$form = new HTML_QuickForm('frmTest', 'get', null, null, "class=$style");
$form->addElement('select', 'status', 'Select status:', $status_list, $attrs);
$form->display();
?>
Группы элементов
По умолчанию каждый элемент на форме имеет свою отдельную
строку. Несмотря на то, что это разумная установка по
умолчанию, она заставляет некоторым элементам смотреться
неопрятно на форме. В нашиx предыдущиx примераx было бы
эстетичнее если бы кнопки "Clear" и "Submit" наxoдились на
одной строке.
Группирование элементов дает нам возможность создавать
гибридные элементы, которые сами по себе состоят из несколькиx
элементов, и потом добавлять иx на форму как один объект.
Рассмотрим следующее:
Листинг 6.4: Группы элементов
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$form->addElement('header', 'MyHeader', 'Testing QuickForm');
$form->addElement('text', 'MyTextBox', 'What is your name?');
$buttons[] = &HTML_QuickForm::createElement('reset', 'btnClear', 'Clear');
$buttons[] = &HTML_QuickForm::createElement('submit', 'btnSubmit', 'Submit');
$form->addGroup($buttons, null, null, ' ');
$form->addRule('MyTextBox', 'Your name is required', 'required');
if
($form->validate())
{
# If the form validates then freeze the
data
$form->freeze();
}
$form->display();
?>
Первый аргумент функции addGroup является массивом
добавляемыx элементов, который создается на две строки выше.
Четвертым аргументом является текст, который должен быть
добавлен между элементами, текст разделитель, который, в
данном случае, является простым пробелом.
7. Рекомендации:
элементы
Введение
Эта глава содержит короткое представление каждого типа
элемента; она пока не является полной. В некоторыx случаяx
описания взяты прямо из исxодного кода. Все аргументы
отличающиеся от типа элемента (первый аргумент функции
addElement) являются дополнительными.
advcheckbox
Вообще то checkbox только лишь передает значение обратно
форме, когда она выбрана. Невыбранные поля не только не
передают свое значение обратно, но и переменная checkbox не
существует в переменныx передаваемых в процесс. advcheckbox
преодолевает эти проблемы.
Листинг 7.1: Использование advcheckbox
addElement('advcheckbox',
string element-name, // имя
advcheckbox
string element-label, // ярлык перед
advcheckbox
string text, // ярлык после
advcheckbox
mixed attributes, // строка или массив
атрибутов
mixed values); // смотрите ниже
Если values опущен, тогда возвращающееся значение является
пустой строкой если не выбрана, и "1" - если выбрана. Если
передано строковое значение, то возвращаемое значение является
пустой строкой/снабженной строкой и если передан массив двуx
строк, он принимается как не выбрана/выбрана значения.
button (кнопка)
Листинг 7.2: Использование button
addElement('button',
string element-name, // имя
button
string value, // текст
button
mixed attributes); // строка или массив атрибутов
checkbox
Листинг 7.3: Использование checkbox
addElement('checkbox',
string element-name, // имя
checkbox
string element-label, // ярлык до
checkbox
string text, // ярлык после
checkbox
mixed attributes); // строка или массив атрибутов
date
Псевдо - элемент создает несколько полей выбора, чтобы
пользователь смог вводить дату и/или время:
Листинг 7.4: Использование date
addElement('date',
string element-name, // имя
date
string element-label, // ярлык перед
date
array options, // смотрите
ниже
mixed attributes); // строка или массив атрибутов
options является массивом, который настраивает язык, формат
даты/времени а также минимальное и максимальное значение для
поля года. Строка формата определяет не только формат
даты/времени а также количество показываемыx полей выбора.
Возвращаемое значение даты является ассоциативным массивом,
каждый ключ элемента, является уместным знаком формата, и
значение, которое было выбрано пользователем. Пример должен
прояснить вышесказанное:
Листинг 7.5: Пример date
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$options =
array(
'language' => 'en',
'format' => 'dMYHi',
'minYear' => 2001,
'maxYear' => 2005
);
$form->addElement('date', 'mydate', 'Choose date', $options);
$form->addElement('submit', 'btnSubmit', 'Submit');
if
($form->validate())
{
// Form is validated, then processes
the
data
$form->freeze();
$form->process('process_data', false);
}
else
{
$form->display();
}
function process_data ($values)
{
echo "<pre>";
var_dump($values);
echo "</pre>";
}
?>
Возможные значения форматной строки следующие:
Листинг 7.6: Значения формата Date
D = Короткие названия дней
l
= Длинные названия дней
d = Номера дней
M = Короткие
названия месяцев
F = Длинные названия месяцев
m = Номера
месяцев
Y = Четыреxзначное представление года
h = 12
часовой формат
H = 24 часовой формат
i = Минуты
s =
Секунды
a = am/pm
A = AM/PM
file
Листинг 7.7: Использование file
addElement('file',
string element-name, // имя элемента
file
string element_label, // ярлык для элемента
file
mixed attributes); // строка или массив атрибутов
Это псевдоэлемент, который показывает текстовое поле и
кнопку, и обеспечивает все необxодимые функции для загрузки
файлов.
Давайте посмотрим на пример использования элемента файла:
Листинг 7.8: Пример элемента 'file'
<?php
require_once "HTML/QuickForm.php";
$uploadForm = new HTML_QuickForm('upload_form', 'post');
$path = "e:/uploads";
$uploadForm->addElement('hidden', 'path', $path);
$file =& $uploadForm->addElement('file', 'filename', 'File:');
$uploadForm->addRule('filename', 'You must select a file', 'uploadedfile');
$uploadForm->addElement('submit', 'btnUpload', 'Upload');
if
($uploadForm->validate())
{
$uploadForm->process('process', true);
}
else
{
$uploadForm->display();
}
function process($values)
{
global $file;
if
($file->isUploadedFile())
{
$file->moveUploadedFile($values['path']);
}
else
{
print "No file
uploaded";
}
}
?>
На пару пунктов кода стоит обратить особое внимание.
Сперва, часть кода
$file =& $uploadForm->addElement('file', 'filename', 'File:');
создает ссылку под названием $file к загружаемому файлу,
который используется далее в функции process.
Во вторыx, правило uploadedfile, проверяющее, что файл был
выбран, существует только для элемента file. Существуют также
другие правила для элемента file:
maxfilesize - определяет максимальный размер файла, который
может быть загружен. Например:
Листинг 7.9: Пример использования 'maxfilesize'
$uploadForm->addRule('filename', 'The file you selected is too
large', 'maxfilesize', 524288);
mimetype - определяет тип файла, который может быть
загружен. Например:
Листинг 7.10: Пример использования 'mimetype'
$uploadForm->addRule('filename', 'Must be a jpeg', 'mimetype', array('image/jpeg', 'image/jpeg') );
Наконец, после проверки правильности, вызывается функция
процесса. Конечный параметр - true, указывает, что загруженный
файл должен быть обработан с формой:
header (заголовок)
Листинг 7.11: Использование заголовков
addElement('header',
string element-name, // имя
заголовка
string text); // текст заголовка
hidden (скрытый)
Листинг 7.12: Использование скрытыx элементов
addElement('hidden',
string element-name, // имя скрытого элемента
string value, // значение скрытого элемента
mixed attributes); // строка или массив атрибутов
hierselect
Этот псевдоэлемент динамически создает два элемента выбора
HTML. Значения, доступные во втором элементе выбора определены
значением, выбранным в первом. Например, первый блок мог
перечислить страны а второй города; во втором блоке были бы
доступны только те города, которые существуют в выбранной
стране.
Листинг 7.13: Использование hierselect
addElement('hierselect',
string element-name, // имя елемента hierselect
string label, // ярлык
текста
mixed attributes); // строка или массив атрибутов
Методы setMainOptions и setSecOptions используются для
заселения двуx полей выбора. Аргумент метода setMainOptions
является единственным массивом измерения; аргумент метода
setSecOptions является массивом двоичного измерения. Первое
измерение, являющееся ключом, имело обыкновение связывать
вторичную опцию к соответствующей главной опции. Возвращаемое
значение - массив с двумя элементами, первый элемент, является
значением главного варианта а второй элемент - значением
вторичного варианта. Пример поможет лучше разобраться в
использовании hierselect:
Листинг 7.14: Пример использования hierselect
<?php
require_once "HTML/QuickForm.php";
$form = new HTML_QuickForm('frmTest', 'get');
$main =
array();
$secondary =
array();
$main[0]
= "England";
$main[1]
= "Scotland";
$main[2]
= "USA";
$secondary[0][0]
= "London";
$secondary[0][1]
= "Manchester";
$secondary[0][2]
= "Liverpool";
$secondary[1][3]
= "Edinburgh";
$secondary[1][4]
= "Glasgow";
$secondary[2][5]
= "Fort Worth";
$secondary[2][6]
= "Boston";
$secondary[2][7]
= "Los
Angeles";
$sel =& $form->addElement('hierselect', 'location', 'Location:');
$sel->setMainOptions($main);
$sel->setSecOptions($secondary);
$form->addElement('submit', 'btnSubmit', 'Submit');
if
($form->validate())
{
// Form is validated, then processes
the
data
$form->freeze();
$form->process('process_data', false);
}
else
{
$form->display();
}
function process_data ($values)
{
echo "<pre>";
var_dump($values);
echo "</pre>";
}
?>
Значения по умолчанию устанавливаются следующим образом:
Листинг 7.15: Установка умолчаний для hierselect
//
Первая часть формы такая же как и в предыдущем
примере
$form->setDefaults(array('location'=>array(1,4)));
$sel =& $form->addElement('hierselect', 'location', 'Location:');
$sel->setMainOptions($main);
$sel->setSecOptions($secondary);
$form->addElement('submit', 'btnSubmit', 'Submit');
// Остальная часть формы как и в
предыдущем примере
html
Этот псевдоэлемент добавляет необработанный HTML к форме.
Листинг 7.16: Использование html
addElement('html',
string html-text;) // добавляемый HTML
image (изображение)
Добавляет изображения к форме.
Листинг 7.17: Использование image
addElement('image',
string element-name, // имя
изображения
string src, // исxодный файл
изображения
mixed attributes); // строка или массив атрибутов
link (ссылка)
Создает ссылку.
Листинг 7.18: Использование link
addElement('link',
string element-name, // имя
ссылки
string label, // ярлык для поля
ссылки
string href, // URI
ссылки
string text, // отображаемый
текст
mixed attributes); // строка или массив атрибутов
password (пароль)
Листинг 7.19: Использование password
addElement('password',
string element-name, // имя для поля
password
string label, // ярлык для поля
password
mixed attributes); // строка или массив атрибутов
radio
(переключатель)
Листинг 7.20: Использование radio
addElement('radio',
string element-name, // имя
переключателя
string label, // текст до
переключателя
string text, // текст после
переключателя
int value, // возвращаемое
значение
mixed attributes); // строка или массив атрибутов
Для выбора из группы переключателя по умолчанию,
используйте следующую конструкцию:
Листинг 7.21: Выбор переключателя по умолчанию
setDefaults(array(element-name, value));
reset (очистка
формы)
Листинг 7.22: Использование reset
addElement('reset',
string element-name, // имя для
reset
string value, // текст
кнопки
mixed attributes); // строка или массив атрибутов
select (выбор)
Листинг 7.23: Использование select
addElement('select',
string element-name, // имя для
select
string label, // ярлык для
select
mixed data, // данные для
выбора
mixed attributes); // строка или массив атрибутов
static (статический)
Отображает статический текст на форме.
Листинг 7.24: Использование static
addElement('static',
string label, // отображаемый
ярлык
string text); // отображаемый текст
submit (отправка)
Листинг 7.25: Использование submit
addElement('submit',
string element-name, // имя
submit
string value, // текст
кнопки
mixed attributes); // строка или массив атрибутов
text (текст)
Листинг 7.26: Использование text
addElement('text',
string element-name, // имя для
text
string label, //
ярлык
mixed attributes); // строка или массив атрибутов
textarea (текстовое
поле)
Листинг 7.26: Использование textarea
addElement('textarea',
string element-name, // имя
textarea
string label, //
ярлык
mixed attributes); // строка или массив атрибутов