Учебник по Showcase: Ограничения на значения в XML-файле

Материал из Course Orchestra
Перейти к: навигация, поиск

Внимание! Изложенная здесь информация устарела! В качестве учебника следует использовать https://share.curs.ru/webhelp/ (work in progress).


xml с данными:

<schema xmlns="">
   <info>
      <text/>
      <date/>
      <boolean/>
      <nonnegativeinteger/>
      <double/>
      <double/>
      <readonly/>
      <required/>
      <relevant/>
   </info>
</schema>

Шаблон:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xf="http://www.w3.org/2002/xforms">
    
    <head>
        <xf:model id="mainModel">
        
            <xf:instance id="mainInstance">
                <schema xmlns=""/>
            </xf:instance>
            
            <xf:bind>
                <xf:bind nodeset="/schema/info/text" type="string"/>
                <xf:bind nodeset="/schema/info/date" type="date"/>
                <xf:bind nodeset="/schema/info/boolean" type="boolean"/>
                <xf:bind nodeset="/schema/info/nonnegativeinteger" type="nonNegativeInteger"/>
                <xf:bind constraint=". &gt;=0 and . &lt;=100 or .=''"
                    nodeset="/schema/info/double[1]" type="double"/>
                <xf:bind calculate="/schema/info/nonnegativeinteger * /schema/info/double[1]"
                    nodeset="/schema/info/double[position()=2]" type="double"/>
                <xf:bind nodeset="/schema/info/readonly" readonly="true()"/>
                <xf:bind nodeset="/schema/info/required" required="true()"/>
            </xf:bind>
            
        </xf:model>
    </head>
    
    <body>
        <div> Простой текст: </div>
        <div>
            <xf:input ref="/schema/info/text"/>
        </div>
        <div> Дата: </div>
        <div>
            <xf:input ref="/schema/info/date"/>
        </div>
        <div> Флажок: </div>
        <div>
            <xf:input ref="/schema/info/boolean"/>
        </div>
        <div> Переменная 1 (общая стоимость): </div>
        <div>
            <xf:input ref="/schema/info/nonnegativeinteger"/>
        </div>
        <div> Переменная 2 (%): </div>
        <div>
            <xf:input ref="/schema/info/double[1]">
                <xf:alert>Введите число больше 0 и меньше 100</xf:alert>
            </xf:input>
        </div>
        <div> Переменная 3 (стоимость товарной позиции): </div>
        <div>
            <xf:input ref="/schema/info/double[2]"/>
        </div>
        <div> Только для чтения: </div>
        <div>
            <xf:input ref="/schema/info/readonly"/>
        </div>
        <div> Обязательна для заполнения: </div>
        <div>
            <xf:input ref="/schema/info/required">
                <xf:alert>Обязательно для заполнения</xf:alert>
            </xf:input>
        </div>
    </body>
</html>

Основное преимущество данной реализации XForms состоит в том, что есть возможность проверять вводимые данные без обращения к серверу. Это реализуется с помощью механизма биндов. В тэге <xf:bind/> возможны следующие атрибуты:

  • nodeset
  • type
  • constraint
  • calculate
  • readonly
  • required

Атрибут @nodeset является обязательным и указывает на множество узлов, к которым будет применено ограничение. Атрибут @type определяет тип вводимого в узел значения. Самые распространенные типы следующие:

  • string - текстовые значения (проставляется по умолчанию, если тип не указан)
  • int - целые числа
  • nonNegativeInteger - неотрицательные целые числа
  • boolean - true/false
  • double - действительные числа
  • date - даты

Атрибут @constraint определяет условия, накладываемые на узел Атрибут @calculate показывает расчет значений для данного узла Атрибут @readonly показывает, можно ли заполнять данный узел в форме Атрибут @required показывает, обязателен ли данный узел для заполнения В двух последних случаях активно используются функции false() и true(), возвращающие соответственно тождественный 0 или 1.

Обратите внимание, что если на некий узел наложены бинды, то в элементе отображении этого поля, например <xf:input/>, можно прописать тэг <xf:alert/>. В случае некорректных данных (т.е. которые не соответствуют накладываемым ограничениям), рядом появится предупреждающий значок с всплывающим сообщением (на самом деле у соответствующего элемента html появится новый класс xforms-invalid, поэтому способ визуального отображения ошибки можно настраивать). Также если хотя бы у одного узла значение вышло из накладываемых ограничений, то функция is-valid(instance('mainInstance')) вернет значение false, иначе true. Ее использование мы рассмотрим позднее.