Профессиональная разработка Web-приложений.  
Боишься нашего дизайна?
Новости
PDF журнал
Участники проектa
Сотрудничество
Ссылки
Карта сайта
Комментарии
Комментарии к статье
Добавить комментарий
Обсудить на форуме
Информация об авторе
Оценка статьи

PEAR HTML_QuickForm: Руководство для начинающих

Оригинал находится по адресу http://www.thelinuxconsultancy.co.uk/quickform.html

Перепечатка материалов разрешается при условии ссылки (для интернет-изданий - гиперссылки) на сайт phpclub.ru/detail .

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 backgroundgreen; }
       .
warn backgroundyellow; }
       .
error backgroundred; }
    </
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'nullnull"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($buttonsnullnull'&nbsp;');
    
    
$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-namevalue)); 

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);  // строка или массив атрибутов 


For comment register here
   2004-06-30 16:59
Приведенный Вами отрывок кода делает следующее: проверяет введенные данные на предмет удовлетворения правилам проверки, если все нормально то замораживает форму, если же нет - отображает форму, чтобы пользователь смог сделать корректировки.

   2004-07-01 22:26
Как сообщить значение поумолчанию для элемента textarea, чтобы сразу было <textarea ...>text</textarea>?
Спасибо

   2004-07-15 23:21
Чтобы поставить значерия по умолчанию используется функция
$form->setDefaults($array)

   2004-08-25 21:09
Статья мне понравилась, великолепно.
На как начинающему мне все же не совсем понятно где взять этот QuikForm и как правильно устанавливать его??

P.S:Если не сложно, ответьте по-подробнее в письме.

   2004-11-10 12:34
Статья интересная. Я PEAR пока не использовал, но после прочтения статьи у меня сложилось впечатление, что это к лучшему. Ведь получается что HTML_QuickForm предназначен только для того, чтобы избавить разработчика от работы с HTML. То есть предлагает слить представление и обработку в единое целое!? А если Вы на входе получаете шаблоны html от дизайнера!? Как тогда быть? Можно ли использовать HTML_QuickForm в этом случае!?

   2004-12-01 12:18
Статьи отличные за исключением одного НО...
Грамматика подкачала...
Убедительная просьба, перитывайте статьи после обработки автопереводчиками, иначе читать их практически невозможно...
Вот к примеру перл из статьи о применении QuickForm
/========================
Если Вы нажмете на кнопку отправки, когда поле имени не заполнено, то увидите сообщение об ошыбке. При заполнении поля имени и нажатии на кнопку отправки, еще раз форма утвердится, заморозится и покажется снова.
========================/
Убедительная просьба администраторам - примите меры.
С наилучшими пожеланиями Курченков Александр aka Linzmen.

   2005-01-06 14:32
Выход - использовать QuickForm и, например, Smarty.
А здесь подробности http://www.thelinuxconsultancy.co.uk/smarty-guide.html

   2005-02-03 17:36
Как при помощи этого класса проверить данные переданные не через тот же файл, что конструируется форма?
Например, форма для авторизации - логин и пароль может находиться на любой странице, а обрабочтик и проверка ОДИН файл.

Спасибо.

   2005-02-12 03:47
> А если Вы на входе получаете шаблоны html от дизайнера!?
> Как тогда быть? Можно ли использовать HTML_QuickForm в этом случае!?
Для вывода конечного HTML в QuickForm используется Renderer. По умолчанию (приведенные в статье примеры) используется HTML_QuickForm::toHtml() который вызывает дефолтный рендерер HTML/QuickForm/Renderer/Default.php
Когда Вы используете движки шаблонов, предполагается использовать рендереры для них, в PEAR есть готовые для HTML_Template_Sigma, HTML_Template_IT, Smarty.
Наиболее подходящий наверно будет вариант Smarty. Примеры самого шаблона и скрипта для инициализации нужных классов есть в тарболе QuickForm в папке docs/renderers

   2005-03-02 19:50
замечательная статья. это мое первое знакомство с PEAR. мне понравилось. далее по мануалу...
только в первой форме... там даже цвет выделился - забыли закрыть код пхп перед </body>
и по вопросу установки PEAR - тут спрашивали, где взять QuickForm.php - это пакет на указанном в начале сайте Pear'a скачать надо. еще пакет Common надо скачать оттуда же. без него не работает. про как его установить там тоже есть.

   2005-04-13 14:04
Статья очень полезная для новичков в PEAR. Но мне не понятно одно - как сделать, чтобы после нажатия кнопки Submit (после проверки вводимых данных) запускался другой сценарий (например main.php), а то у вас приведен пример только с заморозкой формы?

   2005-06-29 19:42
Великолепная статья! Читал её раньше в оригинале, но в переводе, а к тому же таком качественном, просто супер! Прочитал на одном дыхании.

   2007-10-30 10:44
Статья хорошая и перевод хороший, мало таких написано про pear - в основном кроме самих классов мало что помогает. Но: в статье достаточно много опечаток. Предлагаю подкорректировать. Я не филолог, но могу указать по крайней мере те опечатки, которые нашел.

Пакет QuickFrom из репозитория PEAR зарекоммендовал себя как хороший и перспективный инструмент для быстрого построения и обработки форм, а также для разделения PHP и HTML кода. PEAR, QuickForm, шаблон, движок, шаблонный движок, template, template engine, form, forms, форма, html, quick form

 
 
 
    © 1997-2008 PHPClubTeam
[]