Учебное пособие (1075724), страница 26
Текст из файла (страница 26)
Атрибут submission ссылается наэлемент xforms:submission в модели --><xforms:submit submission="submit_id"><xforms:label>Отправка формы</xforms:label></xforms:submit></xforms:group></body></html>Результат выполнения примера (ошибка ввода числа):Рис.
5.3. Результат выполнения примера 5.2. Файл «input.xhtml».Как правило, большинство XForms-процессоров модифицируют элемент«xforms:input» в зависимости от типа данных элемента. Если элемент логическоготипа, то он отображается в виде флажка, если типа «дата», то появляетсявсплывающее окно с выбором даты и т.д.2475.6.2 Связь данных формы, ограничений и элементов управленияформыВ предыдущем примере использовался вариант связи с использованиематрибута «ref».Модель данныхДанные (инстанс):<xforms:instance xmlns=""><example ><int/></example></xforms:instance>Ограничения на данные:<xforms:bind nodeset="int"type="xforms:integer"/>Элемент управления формы:<xforms:input ref="int"><xforms:label>Введите число:</xforms:label></xforms:input>Рис.
5.4. Вариант связи данных формы, ограничений и элементов управления с использованиематрибута «ref».Этот вариант является рекомендуемым и используется в большинствеслучаев.Элемент управления формы связан напрямую с инстансом данных спомощьюатрибута«ref=XPath-выражение».XPath-выражениевыбираетнеобходимый элемент из инстанса.В случае необходимости в модель добавляются ограничения на данные спомощью элементов «xforms:bind».Элемент «xforms:bind» также связан напрямую с инстансом данных спомощью атрибута «nodeset=XPath-выражение».248Как правило, для одного элемента данных атрибуты «ref» и «nodeset»содержат одинаковые XPath-выражения.Этот вариант связи удобен тем, что ограничения на данные никак не связаныс элементами управления.
Ограничения можно добавлять и удалять по меренеобходимости. При этом ограничения учитываются XForms-процессором привводе данных. Например, в случае логического типа данных, элемент«xforms:input» отображается в виде флажка.Но почему элемент для задания ограничений назван «xforms:bind»? Ведь впереводе «bind» означает связь или связывание, а не ограничение.В ранних версиях спецификации XForms вариант связи с использованиематрибута «ref» считался дополнительным. А рекомендуемым был вариант связи сиспользованием атрибута «bind».Модель данныхДанные (инстанс):<xforms:instance xmlns=""><example ><int/></example></xforms:instance>Ограничения на данные:<xforms:bind nodeset="int" id="id_int" type="xforms:integer"/>Элемент управления формы:<xforms:input bind="id_int"><xforms:label>Введите число:</xforms:label></xforms:input>Рис.
5.5. Вариант связи данных формы, ограничений и элементов управления с использованиематрибута «bind».249В этом варианте элемент «xforms:bind» связан напрямую с инстансом данныхспомощьюатрибута«nodeset=XPath-выражение».Такжеуэлемента«xforms:bind» должен быть задан атрибут «id».Элемент управления формы связан с элементом «xforms:bind» с помощьюатрибута «bind=id элемента xforms:bind».Недостатком этого варианта является то, что в модели всегда необходимосоздавать элемент «xforms:bind», даже если у XML-данных нет ограничений.Поэтому сейчас, как правило, используется предыдущий вариант с атрибутом«ref».Однако, вариант с атрибутом «bind» поддерживается большинством XFormsпроцессоров.
Следующий пример использует вариант с атрибутом «bind».Пример 5.2. Файл «input_bind.xhtml».<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml"xmlns:xforms="http://www.w3.org/2002/xforms"xmlns:ev="http://www.w3.org/2001/xml-events" ><head><title>Пример элемента input (связь через bind)</title><!-- Пустой префикс пространства имен обязателен для корневогоэлемента xforms:instance --><xforms:model><xforms:instance><example xmlns=""><text/><int/><bool/><date/><time/><datetime/></example></xforms:instance>250<!-- Элементы bind указывают тип данных --><!-- Тип данных указывается не для элемента управления, а дляэлемента данных в модели --><xforms:bind id="id_bool" nodeset="bool"type="xforms:boolean"/><xforms:bind id="id_int" nodeset="int" type="xforms:integer"/><xforms:bind id="id_date" nodeset="date" type="xforms:date"/><xforms:bind id="id_time" nodeset="time" type="xforms:time"/><xforms:bind id="id_datetime" nodeset="datetime"type="xforms:dateTime"/><!-- submission указывает куда необходимо отправить форму --><xforms:submission action="" method="post" id="submit_id"includenamespaceprefixes=""/></xforms:model></head><body><xforms:group><xforms:input ref="text"><xforms:label>Введите текст:</xforms:label></xforms:input><!-- Вместо атрибута ref="int" используется атрибут bind="id_int",то есть элемент пользовательского интерфейса привязывается не кэлементу данных модели, а к элементу bind.
Такой вариант допустим,но рекомендуется использовать атрибут ref--><xforms:input bind="id_int"><xforms:label>Введите число:</xforms:label><xforms:alert>Значение должно быть целымчислом</xforms:alert></xforms:input><xforms:input bind="id_bool"><xforms:label>Введите логическое значение:</xforms:label></xforms:input>251<xforms:input ref="date"><xforms:label>Введите дату:</xforms:label></xforms:input><xforms:input bind="id_time"><xforms:label>Введите время:</xforms:label></xforms:input><xforms:input bind="id_datetime"><xforms:label>Введите дату и время:</xforms:label></xforms:input><!-- Кнопка отправки формы. Атрибут submission ссылается наэлемент xforms:submission в модели --><xforms:submit submission="submit_id"><xforms:label>Отправка формы</xforms:label></xforms:submit></xforms:group></body></html>Результат выполнения такой же, как в предыдущем примере.5.6.3 Типы данных в XFormsДляпроверкиправильностивводаданныхXFormsподдерживаетбольшинство типов данных XML Schema.В спецификации XForms отмечается, что не поддерживаются xsd:duration,xsd:ENTITY, xsd:ENTITIES, и xsd:NOTATION.Все эти типы определены в пространстве имен XML-схем, и для нихиспользуется префикс xsd.Но с точки зрения XForms, у большинства этих типов есть существенныйнедостаток – пустое значение в них считатеся «неправильным».
Однако, в XForms252пустое значение должно считаться «правильным», так как пользователь может невводить данные.Для решения этой проблемы были введены типы данных в пространствеимен XForms. В отличие от типов данных XML-схем пустое значение в нихсчитается «правильным». Названия этих типов данных совпадают с названиямитипов данных в XML-схемах, но в качестве префикса пространства имениспользуется префикс XForms.Поэтому в предыдущих примерах использовались типы «xforms:integer»,«xforms:date», а не «xsd:integer», «xsd:date».Полный список дополнительных типов в пространстве имен XFormsприведен в главе 5 (Datatypes) спецификации XForms [XForms, 2009].В следующем списке перечислены наиболее часто используемые типы впространстве имен XForms: xforms:dateTime xforms:time xforms:date xforms:string xforms:boolean xforms:float xforms:decimal xforms:double xforms:anyURI xforms:QName xforms:integer xforms:nonPositiveInteger xforms:negativeInteger xforms:long xforms:int253Значения этих типов данных рассмотрены в спецификации XML-схем [XMLSchema Part 2 Datatypes, 2004].Отличие от соответствующих типов в XML-схеме состоит в том, что в XMLсхеме«пустое»значениеданныхдлябольшинстватиповсчитается«неправильным» значением, а в пространстве имен XForms пустое значениедопустимо.ИнтереснойособенностьюXFormsявляетсявозможностьобъявлятьсобственные типы на основе типов XML-схем и использовать их при проверкеданных.Создаваемый тип данных должен быть простым (xsd:simpleType), онсоответствует одному XML-элементу (одному полю ввода), и может использоватьфасеты XML-схем для задания дополнительных ограничений.Составной тип данных (xsd:complexType) в этом случае использоваться неможет, так как он объявляет тип данных из нескольких XML-элементов, чтосоответствовало бы нескольким полям ввода.В следующем примере создается новый тип данных на основе перечисления(xsd:enumeration) и этот тип используется при проверке данных.Пример 5.2.
Файл «input_newtype.xhtml».<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml"xmlns:xforms="http://www.w3.org/2002/xforms"xmlns:ev="http://www.w3.org/2001/xml-events"xmlns:xsd="http://www.w3.org/2001/XMLSchema">В пространствах имен дополнительно объявляется пространство имен дляXML-схемы.<head><title>Пример элемента bind</title><!-- Пустой префикс пространства имен обязателен для корневогоэлемента xforms:instance --><xforms:model>254<!-- Создание нового типа данных, который используется припроверке.
Тип данных объявляется в модели. --><xsd:schema><xsd:simpleType name="NewType"><xsd:restriction base="xsd:string"><xsd:enumeration value='abc'/><xsd:enumeration value='123'/></xsd:restriction></xsd:simpleType></xsd:schema>Создание нового типа данных NewType. Это строка, которая можетсодержать значение «abc» или «123».Объявление нового типа данных (элемент «xsd:schema») вложено в модельданных (элемент «xforms:model»).<xforms:instance><example xmlns=""><newtype/></example></xforms:instance><!-- Тип данных указывается не для элемента управления, а дляэлемента данных в модели --><xforms:bind nodeset="newtype" type="NewType"/><!-- submission указывает куда необходимо отправить форму --><xforms:submission action="" method="post" id="submit_id"includenamespaceprefixes=""/></xforms:model></head><body><xforms:group><xforms:input ref="newtype"><xforms:label>Введите 'abc' или '123':</xforms:label><xforms:message ev:event="xforms-valid">Введено правильноезначение</xforms:message>255<xforms:message ev:event="xforms-invalid">ВведеноНЕправильное значение</xforms:message></xforms:input>Элемент «xforms:message» выводит всплывающее окно с сообщением.
Здесьэтот элемент используется как обработчик событий «xforms-valid» (формазаполнена правильно) и «xforms-invalid» (форма заполнена неправильно).<!-- Кнопка отправки формы. Атрибут submission ссылается наэлемент xforms:submission в модели --><xforms:submit submission="submit_id"><xforms:label>Отправка формы</xforms:label></xforms:submit></xforms:group></body></html>Результат выполнения примера (ввод правильного и неправильногозначения):256Рис.
5.6. Результат выполнения примера 5.2. Файл «input_newtype.xhtml».В этом примере впервые используется реакция на события (атрибут«ev:event»).Элемент «xforms:message» без атрибута «ev:event» всегда выводит заданноесообщение. Но с атрибутом «ev:event=название события» он превращается вобработчик события, сообщение выводится, только если происходит событие.5.6.4 Задание ограничений на данные с помощью элементаxforms:bindВ предыдущих примерах мы задавали только ограничения на типы данных.Но с помощью элемента xforms:bind можно задавать различные ограничения.Несмотря на то, что ограничения накладываются на данные в модели данных,пользователь фактически сталкивается с этими ограничениями в элементахуправления формы.















