Учебное пособие (1075724), страница 35
Текст из файла (страница 35)
5.26. Результат выполнения примера 5.3. Файл «repeat_variant.xhtml».У элемента «xforms:repeat» существует важное ограничение. Он может бытьвложен не во все элементы XHTML, например, его нельзя использовать стабличными элементами. То есть из-за ограничений спецификации XHTMLнельзя сделать таблицу, в которой строки повторялись бы с помощью элемента«xforms:repeat».Для преодоления этого ограничения в спецификацию XForms были введеныатрибуты, которые аналогичны атрибутам элемента «xforms:repeat»: repeat-model repeat-bind repeat-nodeset repeat-startindex repeat-number334Эти атрибуты должны быть атрибутами XHTML-элементов.
То есть вместоиспользования конструкции (которая не соответствует стандарту XHTML):<table><repeat nodeset="...">используется конструкция (которая соответствует стандарту XHTML):<table xforms:repeat-nodeset="...">В следующем примере для создания повторяющихся строк в таблице вместоэлемента «xforms:repeat» используется атрибут «repeat-nodeset».Пример 5.3. Файл «repeat_table.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>Пример таблицы и элемента repeat</title><!-- Пустой префикс пространства имен обязателен для корневогоэлемента xforms:instance --><xforms:model><xforms:instance><example xmlns=""><item><text>текст 1</text><int>1</int></item><item><text>текст 2</text><int>2</int></item><item><text>текст 3</text><int>3</int></item></example></xforms:instance>335<xforms:bind nodeset="int" type="xforms:integer"/></xforms:model></head><body><!-- Атрибут xforms:repeat-nodeset="item" выполняет функциюэлемента repeat.
Элемент repeat (из схемы xforms) не может бытьвложен в table (из схемы xhtml), так как спецификация xhtml этого недопускает --><table border="2" xforms:repeat-nodeset="item"><tr><td><xforms:input ref="text"/></td><td><xforms:input ref="int"/></td></tr></table></body></html>Результат выполнения примера:Рис. 5.27. Результат выполнения примера 5.3. Файл «repeat_table.xhtml».5.8 Элементы обработки событийЭлементы обработки событий позволяют обрабатывать события и менятьXML-данные в модели данных.336Эти элементы не используются в простых XForms-формах.
Они нужны длясоздания сложных интерактивных форм.Мы будем использовать только основные элементы обработки событий.5.8.1 Элемент actionПозволяет группировать другие элементы обработки событий.Этот элемент удобно использовать как операторные скобки для условия илицикла.Условие и цикл можно задавать с помощью атрибутов «if=XPath-выражение,возвращающее логическое значение» и «while=XPath-выражение, возвращающеелогическое значение».Если задан атрибут «if», то действие выполняется один раз, если логическоезначение истинно.Если задан атрибут «while», то действие выполняется многократно, покалогическое значение истинно.Также обязательно должен быть задан атрибут «ev:event=событие», которыйопределяет, обработчиком какого события является данный элемент.
Префикс«ev»соответствуетпространствуименсобытийXML(xmlns:ev="http://www.w3.org/2001/xml-events").Полный список событий приведен в спецификации XForms. Наиболее частоиспользуются следующие события: DOMActivate (событие по-умолчанию дляэлемента, например,нажатие на кнопку). DOMFocusIn xforms-focus (получение фокуса элементом управления). DOMFocusOut (потеря фокуса элементом управления). xforms-value-changed (изменение значения данных). xforms-valid (в результате изменения данных форма заполненаправильно). xforms-invalid (в результате изменения данных форма заполненанеправильно).337Эти атрибуты могут присутствовать у всех элементов обработки событий.5.8.2 Элемент setvalueПозволяет менять значение XML-элемента данных.Ссылка на элемент данных задается с помощью атрибутов группы «SingleNode Binding» (ref, model, bind).Новое значение задается в виде содержимого элемента «setvalue» или спомощью атрибута «value».Могут быть заданы атрибуты «if» и «while».Должен быть задан атрибут события «ev:event=событие».
Атрибут событияможно не задавать, только если элемент «setvalue» вложен в элемент «action», укоторого задано событие.Примеры:<xforms:setvalue ev:event="DOMActivate" model="model1"ref="text2">фиксированное значение</xforms:setvalue><xforms:setvalue ev:event="DOMActivate" model="model1" ref="text2"value="concat(context()/text1,' !!!')" />5.8.3 Элемент deleteПозволяет удалять элемент данных из модели.Атрибут «context=XPath-выражение» задает контекст, в котором удаляетсяэлемент.Атрибут«nodeset=XPath-выражение»позволяетуказатьназваниеповторяющегося элемента для удаления. Это используется в случае удаленияповторяющихся элементов в «xforms:repeat».Атрибут «at=XPath-выражение» позволяет указать позицию удаляемогоэлемента.Пример:<xforms:delete ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"/>338Функцияindexвозвращаетномервыбранногоэлементаданныхв«xforms:repeat», что позволяет удалять текущий (выбранный) элемент из«xforms:repeat».5.8.4 Элемент insertПозволяет добавлять элемент данных.Атрибут «model» задает модель данных.Следующие атрибуты задают приемник данных.Атрибут «context» задает контекст, а атрибут «nodeset» указывает, на какойэлемент нужно ориентироваться при добавлении.Атрибут «at» указывает позицию добавления.Атрибут «position= before | after» предписывает добавлять до или послезаданной позиции.Источник данных задается атрибутом «origin».Пример:<xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"position="after" origin="instance('model2inst')/newvalue/num"/>5.8.5 Элемент setindexУстанавливает текущую позицию в элементе «xforms:repeat».Атрибут «repeat» содержит ссылку на элемент «xforms:repeat», а атрибут«index» содержит номер устанавливаемой позиции.Пример:<xforms:setindex repeat="repeat1" index="1" />5.8.6 Элемент setfocusУстанавливает фокус на нужный элемент управления.Уникальный id элемента управления задается в атрибуте «control» иливложенном элементе «control».Пример:339<xforms:setfocus ev:event="DOMActivate" control="input_1" /><xforms:setfocus ev:event="DOMActivate"><xforms:control value="concat('input_', '2')"/></xforms:setfocus>5.8.7 Элемент dispatchПозволяет направить событие элементу, id которого задается атрибутом«targetid».
Атрибут «name» определяет название события, атрибут «delay»определяет временную задержку перед отправкой события.С помощью этого элемента можно направлять как стандартные события, таки события, определяемые разработчиком.Пример:<xforms:dispatch name="xforms-refresh" targetid="model4" /><xforms:dispatch name="new-event" targetid="model4" delay="5000" />5.8.8 Элемент refreshОбновление данных, относящихся к заданной модели.
С помощью атрибута«model» можно задать модель данных.5.8.9 Элемент loadЗагрузка ресурса в окно браузера.Атрибут «resource» задает URI для загрузки, атрибут «show = new | replace»позволяет загружать ресурс в новое или текущее окно браузера.Пример:<xforms:load ev:event="DOMActivate" show="new"resource="input.xhtml"/>3405.8.10 Элемент sendОтправка данных формы на сервер из обработчика события.
Атрибут«submission» ссылается на элемент «submission», который определяет параметрыотправки формы на сервер.Отличие «submit» состоит в том, что «submit» является элементомуправления и отображается в виде кнопки или гиперссылки. Элемент «send»выполняет действие по отправке формы на сервер и не является элементомуправления.5.8.11 Элемент messageИспользуется для выдачи сообщения.Может содержать атрибут «level= ephemeral | modeless | modal», которыйзадаеттипсообщения:ephemeral(всплывающаяподсказка),modeless(немодальное окно), modal (модальное окно).5.8.12 Примеры обработки событийСледующий пример реализует основные возможности элементов обработкисобытий.Пример 5.4.
Файл «actions.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>Примеры действий</title><xforms:model id="model1"><xforms:instance><example xmlns=""><text1>333</text1><text2/>341</example></xforms:instance></xforms:model><xforms:model id="model2"><xforms:instance id="model2inst"><example xmlns=""><repeat><num>1</num><num>2</num><num>3</num><num>4</num><num>5</num></repeat><newvalue><num>1000</num></newvalue><newvalues><num>100</num><num>101</num><num>102</num></newvalues></example></xforms:instance></xforms:model><xforms:model id="model3"><xforms:instance><example xmlns=""><uri>input.xhtml</uri></example></xforms:instance></xforms:model><xforms:model id="model4"><xforms:instance>342<example xmlns=""><dt/></example></xforms:instance><xforms:bind nodeset="dt" type="xforms:date"/><!-- сообщения для реакции на события --><xforms:message level="modal" ev:event="xforms-ready">Формазагружена (сообщение появляется при загрузке формы)</xforms:message><xforms:message level="modal" ev:event="xforms-refresh">Формаобновлена</xforms:message><xforms:message level="modal" ev:event="newevent">Нестандартное событие</xforms:message></xforms:model></head><body><xforms:group><xforms:label>Использование setvalue и setfocus</xforms:label><xforms:input id="input_1" model="model1" ref="text1"><xforms:label>Введите текст:</xforms:label></xforms:input><xforms:input id="input_2" model="model1" ref="text2"><xforms:label>Установленное значение:</xforms:label></xforms:input><xforms:trigger><xforms:label>Установить фиксированноезначение</xforms:label><xforms:setvalue ev:event="DOMActivate" model="model1"ref="text2">фиксированное значение</xforms:setvalue></xforms:trigger><xforms:trigger>343<xforms:label>Установить введенное значение</xforms:label><xforms:setvalue ev:event="DOMActivate" model="model1"ref="text2" value="concat(context()/text1,' !!!')" /></xforms:trigger><xforms:trigger><xforms:label>Установить фокус на первое полеввода</xforms:label><xforms:setfocus ev:event="DOMActivate" control="input_1" /></xforms:trigger><xforms:trigger><xforms:label>Установить фокус на второе полеввода</xforms:label><xforms:setfocus ev:event="DOMActivate"><!-- Используется вложенный элемент control --><xforms:control value="concat('input_', '2')"/></xforms:setfocus></xforms:trigger></xforms:group><hr/><xforms:group><xforms:label>Добавление элементов впоследовательность</xforms:label><!-- последовательность элементов --><xforms:repeat id="repeat1" model="model2"nodeset="repeat/num"><xforms:input model="model2" ref="."/><xforms:refresh /></xforms:repeat><xforms:output model="model2" value="count(repeat/num)"><xforms:label>Количество элементов:</xforms:label>344</xforms:output><xforms:input model="model2" ref="newvalue/num"><xforms:label>Добавляемый элемент:</xforms:label></xforms:input><xforms:trigger><xforms:label>Добавить перед выбранным</xforms:label><xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"position="before" origin="instance('model2inst')/newvalue/num"/></xforms:trigger><xforms:trigger><xforms:label>Добавить после выбранного</xforms:label><xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"position="after" origin="instance('model2inst')/newvalue/num"/></xforms:trigger><xforms:trigger><xforms:label>Добавить несколько элементов послевыбранного</xforms:label><!-- Добавлвются все элементы num, вложенные в newvalues --><xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"position="after" origin="instance('model2inst')/newvalues/num"/></xforms:trigger><xforms:trigger><xforms:label>Добавить последний послевыбранного</xforms:label><xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"/></xforms:trigger>345<xforms:trigger><xforms:label>Продублировать последний</xforms:label><!-- Если не указан исходный элемент для добавления, то вкачестве исходного используется последний элемент впоследовательности --><!-- Если не указано место для добавления, то добавлениепроизводится после последнего элемента --><xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num"/></xforms:trigger><xforms:trigger><xforms:label>Добавить константу послевыбранного</xforms:label><!-- Элемент insert используется для вставки впоследовательность, а элемент setvalue для установки значения поумолчанию --><xforms:insert ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"position="after" origin="instance('model2inst')/newvalue/num"/><!-- После добавления добавленный элемент становится текущими функция index возвращает его номер --><xforms:setvalue ev:event="DOMActivate" model="model2"ref="repeat/num[index('repeat1')]">фиксированноезначение</xforms:setvalue></xforms:trigger><xforms:trigger><xforms:label>Добавить константу после выбранного2</xforms:label><!-- несколько действий могут быть сгруппированы в элементaction --><xforms:action ev:event="DOMActivate">346<!-- Если шаблон для добавления в атрибуте origin незадан,то шаблоном является последний элемент списка --><xforms:insertmodel="model2" context="repeat"nodeset="num" at="index('repeat1')" position="after" /><!-- После добавления добавленный элемент становитсятекущим и функция index возвращает его номер --><xforms:setvalue model="model2"ref="repeat/num[index('repeat1')]">фиксированноезначение</xforms:setvalue></xforms:action></xforms:trigger><xforms:trigger><xforms:label>Удалить выбранный</xforms:label><xforms:delete ev:event="DOMActivate" model="model2"context="repeat" nodeset="num" at="index('repeat1')"/></xforms:trigger><xforms:trigger><xforms:label>Очистить список</xforms:label><xforms:delete ev:event="DOMActivate" model="model2"context="repeat" nodeset="*"/></xforms:trigger><xforms:trigger><xforms:label>Пронумеровать элементы</xforms:label><!-- несколько действий могут быть сгруппированы в элементaction --><xforms:action ev:event="DOMActivate"><!-- Установка позиции по умолчанию в 1 --><xforms:setindex repeat="repeat1" index="1" /><!-- Элемент action выполняется с условием, пока номертекущего элемента в repeat <= 5 (вместо константы должна бытьпроверка количества элементов) -->347<!-- Должно быть XPath-выражение index('repeat1') <=count(instance('model2inst')/repeat/num)--><!-- но сравнение с количеством элементов в правой частине работает --><!--поэтому вместоcount(instance('model2inst')/repeat/num) используется константа 5 -><!-- index('repeat1') возвращает текущую позицию в repeat--><xforms:action while="index('repeat1') <= 5"><!-- Элемент setvalue присваивает текущему элементуrepeat/num (в квадратных скобках указывается индекс текущегоэлемента) позицию этого элемента в repeat --><xforms:setvalue model="model2"ref="repeat/num[index('repeat1')]" value="index('repeat1')"/><!-- Переход к следующему элементу repeat --><xforms:setindex repeat="repeat1"index="index('repeat1') + 1" /></xforms:action></xforms:action></xforms:trigger><xforms:trigger><xforms:label>Отмена изменений в форме</xforms:label><xforms:reset ev:event="DOMActivate" model="model2"/></xforms:trigger></xforms:group><hr/><xforms:group><xforms:label>Навигация между формами</xforms:label><xforms:trigger><xforms:label>Открытие формы 1</xforms:label>348<!-- Адрес читается из модели --><xforms:load ev:event="DOMActivate" model="model3" ref="uri"show="new"/></xforms:trigger><xforms:trigger><xforms:label>Открытие формы 2</xforms:label><!-- Адрес задан в виде константы с помощью атрибутаresource --><xforms:load ev:event="DOMActivate" show="new"resource="input.xhtml"/></xforms:trigger><xforms:trigger><xforms:label>Открытие формы в текущем окне</xforms:label><!-- Адрес задан в виде константы с помощью элементаresource --><xforms:load ev:event="DOMActivate" model="model3" ref="uri"show="replace"/></xforms:trigger></xforms:group><hr/><xforms:group><xforms:label>Обработка событий</xforms:label><xforms:input model="model4" ref="dt"><xforms:label>Введите неправильную дату:</xforms:label><xforms:message ev:event="xforms-invalid"><xforms:outputref="."/> - неправильное значение для даты</xforms:message></xforms:input><xforms:trigger><xforms:label>Отправка события refresh</xforms:label>349<!-- Адрес задан в виде константы с помощью атрибутаresource --><xforms:dispatch name="xforms-refresh" targetid="model4" /></xforms:trigger><xforms:trigger><xforms:label>Отправка собственного события с задержкой 5секунд</xforms:label><!-- Адрес задан в виде константы с помощью атрибутаresource --><xforms:dispatch name="new-event" targetid="model4"delay="5000" /></xforms:trigger></xforms:group></body></html>Результат выполнения примера:Рис.














