Глава
12
Построение
форм
В предыдущих
главах мы уже неоднократно использовали HTML-тег <FORM> позволяющий создавать
формы для обработки данных. Впрочем, в ColdFusion существует тег <CFFORM>,
предназначенный для той же цели, но при этом включающий в себя помимо текстовых
полей ввода, флажков, переключателей (или радиокнопок) и списков, такие элементы,
как дерево (tree), движок (slider), сетку данных (grid), а также предоставляющий
возможность дополнять форму собственными Java-апплетами.
Помимо дополнительных
элементов, позволяющих с легкостью обогатить собственные формы, применение тега
<CFFORM> в сочетании с тегами ввода помогает контролировать поля ввода
с помощью встроенного атрибута VALIDATE, тем самым облегчая написание кода.
В то же время вы можете использовать HTML-тег <FORM> в комбинации с тегом
<CFFORM>, используя атрибут PASSTHROUGH, но обо всем по порядку.
Тег формы
<CFFORM> имеет следующие базовые управляющие элементы:
Тег формы
<CFFORM> может содержать управляющие элементы, основанные на Java-апплетах:
Синтаксис:
<CFFORM NAME
= "name"
ACTION = "form_action"
PRESERVEDATA
= "Yes I No"
ENABLECAB =
"Yes | NO"
ONSUBMIT = "javascript"
TARGET = "window__name"
ENCTYPE = "type"
PASSTHROUGH
= "HTML_attributes"
CODEBASE = "URL"
ARCHIVE = "URL">
Элементы формы </CFFORM>
В табл. 12.1
представлено описание атрибутов тега <CFFORM>.
Таблица
12.1. Описание атрибутов тега <CFFORM>
Атрибут |
Описание |
||
NAME ACTION PRESERVEDATA
ENABLECAB |
Наименование
формы. Необязательный атрибут Имя ColdFusion-страницы,
которая будет обрабатывать переменные формы. Обязательный атрибут Определяет,
отражать ли данные, которые были введены в форме, образованной тегом
<CFFORM>, на странице, указанной атрибутом ACTION. Этот атрибут
предназначен для управляющих элементов <CFSLIDER> И <CFTEXTINPUT>.
ДЛЯ управляющего элемента <CFTREE> позволяет раскрывать предварительно
выбранные ПУНКТЫ. ДЛЯ <CFTREE> атрибут COMPLETEPATH ДОЛЖ6Н быть
равен Yes. Возможные значения: • Yes —да; •
No — нет (по умолчанию) Атрибут может
использоваться, если страница с формой и страница, указанная атрибутом
ACTION, являются одним и тем же файлом, либо если на странице, указанной
атрибутом ACTION, установлены идентичные управляющие элементы с теми
же именами. Необязательный
атрибут В версии ColdFusion Server 5.0 не используется |
||
Атрибут |
Описание |
||
ONSUBMIT |
Определяет JavaScript-обработчик
активизации формы. Применяется для проверки с помощью кода JavaScript
правильности заполнения элементов формы. Необязательный атрибут |
||
TARGET |
Имя окна или
фрейма, куда будет передан результат заполнения формы. Необязательный
атрибут |
||
ENCTYPE |
MIME-тип для
указания формата посылки данных. По умолчанию принимает значение application/x-www-form-urlencoded,
рекомендуется не изменять. Атрибут включен для совместимости с предыдущими
версиями. Необязательный атрибут |
||
PASSTHROUGH |
Установка возможности
использования HTML-тега <FORM> в комбинации с тегом <CFFORM>
для тега <CFINPUT>. Возможные значения: • Yes -да; •
NO — нет (по умолчанию). Необязательный атрибут |
||
CODEBASE |
URL для разгрузки
(download) дополнения (plug-ins) JRE. Только для Internet Explorer.
Значение по умолчанию /CFiDE/classes/ cf-j2re-win. cab. Необязательный
атрибут |
||
ARCHIVE |
URL для разгрузки
(download) Java-классов управляющих средств (controls) ColdFusion.
Значение по умолчанию /CFiDE/classes/ CFJava2 . jar. Необязательный
атрибут |
||
С помощью
тега <CFINPUT> можно создавать такие управляющие элементы, как текстовые
поля ввода, поля ввода пароля, флажки и переключатели (радиокнопки). За выбор
типа управляющего элемента отвечает обязательный атрибут TYPE тега <CFINPUT>,
который может принимать значения:
Например:
<CFINPUT
TYPE="text" NAME="FirstName" VALUE="Anna" SIZE="10"
MAXLENGTH="11">
Таким образом,
мы создаем текстовое поле с заранее определенным значением "Anna",
указанием размера поля с помощью атрибута SIZE и установкой максимального количества
вводимых символов, используя атрибут MAXLENGTH.
Или, например:
<CFINPUT
TYPE="password" NAME="Password" SIZE="10" MAXLENGTH="11">
С помощью
приведенного примера создаем поле для ввода пароля. Следует отметить, что атрибуты
SIZE и MAXLENGTH не распространяются на элементы С типами radio И checkbox.
Следующий
пример:
<CFINPUT
TYPE="checkbox" NAME="SubDis" VALUE="1" CHECKED="Yes">
Как видно
по установленному атрибуту TYPE, это флажок, и определен он как выбранный по
умолчанию, о чем говорит атрибут CHECKED. Причем передача указанного значения
с помощью атрибута VALUE будет только в том случае, когда флажок отмечен как
выбранный.
И еще один
пример, демонстрирующий уже создание группы переключателей:
Children<CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="1"> Adult><CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="2" CHECKED>
Senior<CFINPUT TYPE="radio" NAME="AgeGroup" VALUE="'3">
В этом примере
отметим следующее, все три элемента имеют общее имя (атрибут NAME равен "AgeGroup"),
тем самым мы указываем, что эти элементы относятся к одной группе, только один
из них может быть выбран, и его значение будет передано. При использовании переключателей
следует указывать значения элементов, используя атрибут VALUE. С помощью атрибута
CHECKED мы указали выбранное по умолчанию значение равное 2. Заметим, что в
ColdFusion для атрибутов с возможными значениями наподобие Yes/No, необязательно
записывать Yes или NO, можно просто указать атрибут, и такая конструкция будет
означать Yes.
Полный код
может выглядеть так:
<HTML>
<HEAD>
<TITLE>CFINPUT</TITLE>
</HEAD> <BODY>
<hl>Log
In</hl>
<TABLE border='0' cellspacing='2' cellpadding='2'>
<CFFORM NAME="Forml" ACTION="LogInGO.cfm">
<TR><TD
align="right">First Name: </TD><TD>
<CFINPUT
TYPE="text" NAME="FirstName" VALUE="Anna"
SIZE="10"
MAXLENGTH="11"> </TDX/TR>
<TR><TD align="right">Password:</TD><TD>
<CFINPUT TYPE="password"
NAME="Password"
SIZE="10" MAXLENGTH="11"> </TD></TR>
<TR><TD
align="right">Age Group:</TD><TD>
Children<CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="1"> Adult<CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="2" CHECKED
Senior<CFINPUT TYPE="radio" NAME="AgeGroup" VALUE="3">
</TD></TR> <TRXTD align="right">To subscribe for
dispatch:</TD><TD>
<CFINPUT TYPE="checkbox" NAME="SubDis" VALUE="1" CHECKED="Yes"> </TD></TR>
<TR><TD
align="right"xinput type='submit' value='Send'></TD>
<TD><input type='reset' value=' Reset '></TD></TR> </CFFORM>
</TABLE>
</BODY> </HTML>
Для удобства
размещения элементов на странице мы использовали HTML-тег <TABLE>, а флажок
SubDis поместили в конце для придания форме эстетического вида.
При создании
форм достаточно часто приходится проверять правильность заполнения полей формы,
как мы уже неоднократно демонстрировали, как с помощью программ на языке JavaScript,
так и тегов ColdFusion. Однако при использовании тегов <CFINPUT> и <CFTEXTINPUT>
можно проконтролировать введенные данные без написания какого-либо кода, указав
атрибут VALIDATE,
ВХОДЯЩИЙ В ЭТИ тэги.
Атрибут VALIDATE,
в свою очередь, может принимать следующие значения:
При указании
одного из вышеперечисленных значений атрибута VALIDATE также можно установить
атрибут сообщения MESSAGE, которое будет выводиться на экран при заполнении
данными недопустимого формата.
Контроль
с помощью регулярных выражений
Помимо значений,
контролирующих ввод данных с предопределенными правилами при использовании тегов
<CFINPUT> и <CFTEXTINPUT>, можно применять регулярные выражения
(regular expression) для проверки соответствия
текста, вводимого пользователем, собственному образцу, указанному с помощью
атрибута PATTERN. Для определения образца того или иного поля ввода необходимо
использовать обычные символы в сочетании со специальными символами.
Регулярные
выражения позволяют проверять текстовые поля ввода для разнообразных условий.
Можно создавать регулярное выражение, которое соответствует только числам в
определенном диапазоне. Можно объединять простые регулярные выражения в сложные
критерии поиска, чтобы соответствовать сложным образцам, например, одного из
слов с различными окончаниями. Также в регулярных выражениях можно использовать
переменные и функции ColdFusion, т. к. ColdFusion Server вычисляет переменные
и функции прежде, чем определяется регулярное выражение.
В первую
очередь следует отметить, что при формировании образца с помощью регулярного
выражения для отображения специальных символов как обычных, следует использовать
левую наклонную черту \ в качестве предшествующего этому символу. Например,
для отображения знака + следует писать \+.
Специальными
символами следует считать:
-*?.[^$(){|\
Приведем
характерные правила для регулярных выражений. 3 Точка (.) соответствует любому
символу.
Например
(good) ?bye предполагает goodbye или bye.
Также при
формировании регулярных выражений можно использовать escape-последовательности.
Например, такие как:
И Т.Д.
Пример
использования атрибута VALIDATE
Приведенный
ниже пример позволяет продемонстрировать проверку заполняемых полей текущей
формы с помощью атрибута VALIDATE, имеющего как конкретные знанения, так и значения
на основе регулярного выражения, образец которого определен с помощью атрибута.
PATTERN:
<HTML>
<HEAD>
<TITLE>CFFORM
Validation</TITLE> </HEAD> <BODY>
<hl>Sign
Up</hl>
<TABLE border='0' cellspacing='2' cellpadding='0'>
<CFFORM NAME="Forml" ACTION="SignUpGO.cfm" >
<TR><TD align="right">E-Mail</TDXTR>
<CFINPUT TYPE="text"
NAME="EMail"
REQUIRED="Yes"
VALIDATE="Regular_expression"
РАТТЕКЫ="^[A-Za-z0-9_.]+(@){1}[A-Za-zO-9_.]+$"
SIZE="15"
MAXLENGTH="16"> </TD></TR>
<TR><TD align="right">First Name</TD><TD>
<CFINPUT TYPE="text"
NAME="FirstName"
REQUIRED="Yes"
VALIDATE="Regular_expression"
PATTERN="[A-Za-z]"
MESSAGE="First
Name, should not be empty and to include symbols 'A-Za-z'"
SIZE="10",MAXLENGTH="11">
</TD></TR>
<TR><TD align="right">Birthday</TD><TD>
<CFINPUT
TYPE="text" NAME="Birthday"
REQUIRED="Yes"
VALIDATE="Eurodate"
SIZE="10"
MAXLENGTH="11"> </TD></TR>
<TRXTD align="right">Phone Num.</TD><TD>
<CFINPUT TYPE="text"
NAME="PhoneNum"
REQUIRED="Yes"
VALIDATE="Telephone" SIZE="12" MAXLENGTH="13">
</TD></TR> <TR><TD align="right"><input
type='submit' value=' Add '></TD>
<TD><input type='reset' value='Clear'></TD></TR> </CFFORM>
</table>
</BODY> </HTML>
В приведенном
примере мы создаем правила ввода для полей EMail и FirstName, используя регулярные
выражения, и указываем контролирующие значения для полей Birthday и phoneNum
со встроенными правилами. При этом для поля FirstName создаем собственное сообщение
об ошибке.
Контроль
с помощью кода JavaScript
Как отмечалось,
в предыдущих разделах мы уже применяли HTML-тег <FORM>, позволяющий создавать
формы для обработки данных, где, впрочем, уже и использовали код JavaScript
для контроля вводимых данных. При указании тега <CFFORM> также можно добавлять
код JavaScript. Для этой цели следует использовать атрибут ONVALIDATE таких
элементов формы как <CFINPUT>, <CFTEXTINPUT>, <CFSLIDER>,
<CFTREE>, <CFGREED>.
При этом
функции, указанной атрибутом ONVALIDATE, передаются такие объекты, как форма
(form_obj), текущий элемент ввода (input_obj) и значение текущего элемента ввода.
Можно также
использовать атрибут ONERROR для указания функции JavaScript, которая выполняется,
если при заполнении полей формы происходит ошибка, т. е. когда введенные значения
не удовлетворяют установленным правилам, причем независимо от того, с помощью
VALIDATE или ONVALIDATE регулируются эти правила.
Атрибут ONERROR
возможно применять в таких элементах формы, как <CFINPUT>, <CFTEXTINPUT>,
<CFSELECT>, <CFSLIDER>, <CFTREE>, <CFGREED>.
При этом
функции, указанной атрибутом ONERROR, передаются такие объекты, как форма (form_obj),
текущий элемент ввода (input__obj), значение текущего элемента ввода и текст
сообщения об ошибке.
Пример
с использованием JavaScript
Приведенный
далее пример продемонстрирует проверку заполняемых полей текущей формы, используя
как значения атрибута VALIDATE с применением атрибута ONERROR, так и код JavaScript,
указывая при этом названия функций с помощью атрибута ONVALIDATE:
<HTML>
<HEAD>
<TITLE>CFFORM JavaScript Validation</TITLE> </HEAD> <BODY>
<script>
function Birthday_error(form, input, val, mess)
{ input.value='dd/mm/yyyy'; alert(mess); }
function Pass_(form){
if (form.Pass.value == "")
{ return (false); }
else { return (true); } }
function Conf_(form,
input, val){
if (form.Pass.value = val)
{ return (true); }
else { return
(false); } }
</script>
<hl>Sign Up</hl>
<TABLE border='0' cellspacing='2' cellpadding='0'>
<CFFORM NAME="Forml" ACTION="SignUpGO.cfm" >
<TR><TD align="right">First Name</td><td>
<CFINPUT TYPE="text"
NAME="FirstName"
REQUIRED="Yes"
VALIDATE="Regular_expression" PATTERN="[A-Za-z]" SIZE="10"
MAXLENGTH="11"> </TD></TR>
<TR><TD align="right">Birthday</TD><TD>
<CFINPUT TYPE="text"
NAME="Birthday"
REQUIRED="Yes"
VALIDATE="Eurodate" ONERROR="Birthday_error" SIZE="10"
MAXLENGTH="11"> </TD></TR>
<TR><TD align="right">Password</TD><TD>
<CFINPUT TYPE="password"
NAME="Pass"
REQUIRED="Yes"
ONVALIDATE="Pass_" MESSAGE="Password, should not be empty"
SIZE="8" MAXLENGTH="9"> </TD></TR>
<TR><TD align="right">Confirm</TD><TD>
<CFINPUT TYPE="password"
NAME="Conf"
REQUIRED="Yes"
ONVALIDATE="Conf_" MESSAGE="Fields: Password and Confirm,
should be identical!"
SIZE="8" MAXLENGTH="9"> </TD></TR>
<TRXTD align="right"xinput type='submit' value=' Add '></TD>
<TD><input type='reset' value='Clear'></TD></TR>
</CFFORM> </TABLE>
</BODY>
</HTML>
В приведенном
примере мы создаем правила ввода для поля FirstName, используя регулярное выражение,
указываем контролирующее значение для поля Birthday со встроенным правилом с
помощью атрибута ONERROR и устанавливаем для полей Pass и conf контроль над
вводом данных с помощью JavaScript.
В то же время
вы можете добавить HTML-тег <FORM> в комбинации с тегом <CFFORM>,
используя атрибут PASSTHROUGH следующим образом:
<HTML>
<HEAD>
<TITLE>CFFORM(PASSTHROUGH)
JavaScript Validation</TITLE> </HEAD> <BODY> <script>
function FName(val){
if(val=="")
return false; else return true; }
</script>
<hl>Sign Up</hl>
<TABLE border='0' cellspacing='2' cellpadding='0'>
<CFFORM NAME="Form1" ACTION="SignUpGO.cfm">
<TR><TD align="right">First Name</TD><TD>
<CFINPUT TYPE="text" NAME="FirstName"
REQUIRED="Yes" SIZE="10" MAXLENGTH="11" MESSAGE="First Name,
should not be
empty" PASSTHROUGH="Yes" onClick = "FName(this.value)">
</TD></TR>
<TR><TD align="right"xinput type='submit' value=' Add '></TD>
<TD><input type=' reset' value=' Clear'></TD></TR> </CFFORM>
</TABLE>
</BODY> </HTML>
В приведенном
примере мы указываем атрибут PASSTHROUGH для поля FirstName и определяем при
возникновении события onclick выполнение функции FName (this, value), что позволяет
контролировать ввод данных для этого поля с помощью JavaScript.