Как создать элемент флажка, получая значения «да» / «нет» вместо «истина» / «ложь»? - PullRequest
1 голос
/ 16 января 2012

У меня проблема, и надеюсь, что это только мой недостаток опыта в XForms. Мне нужно создать элемент флажка для данных, который определен как перечисление «Да» / «Нет». По сути, это просто логическое значение, но с другой парой значений. То, что я уже смог сделать, это то, что в принципе работает, но нуждается в дополнительном узле данных в модели:

<xhtml:html xmlns:xforms="http://www.w3.org/2002/xforms"
    xmlns:f="http://orbeon.org/oxf/xml/formatting"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    >

    <xhtml:head>
        <xforms:model xmlns:xforms="http://www.w3.org/2002/xforms"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" id="main-model">
          <xforms:instance id="instance">
            <main>
              <Boolean>true</Boolean>
              <YesNo>Yes</YesNo>
            </main>
          </xforms:instance>
          <xforms:bind ref="Boolean" type="xsd:boolean" />
          <xforms:bind ref="YesNo" constraint=". = 'Yes' or . = 'No'" />
        </xforms:model>
    </xhtml:head>
    <xhtml:body>
      <xforms:input ref="instance('instance')/Boolean">
        <xforms:label>Boolean: </xforms:label>
        <xforms:action ev:event="xforms-value-changed">
          <xforms:setvalue ref="instance('instance')/YesNo" value="if ( instance('instance')/Boolean = 'true' ) then 'Yes' else 'No'" />
        </xforms:action>
      </xforms:input>
      <br/>
      <xforms:output ref="instance('instance')/Boolean">
        <xforms:label>Boolean:</xforms:label>
      </xforms:output>
      <br/>
      <br/>
      <xforms:select ref="instance('instance')/YesNo" appearance="full">
        <xforms:label>Yes/No: </xforms:label>
        <xforms:item>
          <xforms:label></xforms:label>
          <xforms:value>Yes</xforms:value>
        </xforms:item>
        <xforms:action ev:event="xforms-value-changed">
          <xforms:setvalue ref="instance('instance')/YesNo" value="if ( instance('instance')/YesNo = 'Yes' ) then 'Yes' else 'No'" />
        </xforms:action>
      </xforms:select>
      <br/>
      <xforms:output ref="instance('instance')/YesNo">
        <xforms:label>Yes/No:</xforms:label>
      </xforms:output>
    </xhtml:body>
</xhtml:html>

Этот пример содержит два возможных решения: Первым является стандартный логический флажок, связанный с логическим узлом экземпляра с действием, которое устанавливает значение «Да» / «Нет» для второго узла. Это решение работает хорошо, но требует второго узла данных, который я не могу создать из-за схемы (в приведенном выше примере я обычно мог бы создать второй экземпляр для хранения этого значения, но в реальном проекте эти флажки находятся в блоке повтора, и мне пришлось бы создать дополнительную таблицу значения для этого, что, кажется, очень сложно), Во-вторых, выберите элемент с единственным значением «Да» и действием, которое пытается установить значение «Нет», когда установлено пустое значение (невыбранный элемент). К сожалению, когда этот элемент не выбран, он не может выбрать его снова (отменяет выбор автоматически). Есть ли у вас решение для такой проблемы?

Заранее спасибо

1 Ответ

3 голосов
/ 16 января 2012

Надеюсь, что это решит вашу проблему ..

<xhtml:html xmlns:xforms="http://www.w3.org/2002/xforms"
    xmlns:f="http://orbeon.org/oxf/xml/formatting"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    >

    <xhtml:head>
        <xforms:model xmlns:xforms="http://www.w3.org/2002/xforms"
                xmlns:xs="http://www.w3.org/2001/XMLSchema" id="main-model">
          <xforms:instance id="instance">
            <main>
              <Boolean value="true">Yes</Boolean>
            </main>
          </xforms:instance>
          <xforms:bind ref="Boolean/@value" type="xforms:boolean" readonly="false()" />
          <xforms:bind ref="Boolean" calculate="if(@value=true()) then 'Yes' else 'No'" readonly="false()" />
        </xforms:model>
    </xhtml:head>
    <xhtml:body>
      <xforms:input ref="instance('instance')/Boolean/@value">
        <xforms:label>Boolean: </xforms:label>
      </xforms:input>
      <br/>
      <xforms:output ref="instance('instance')/Boolean">
        <xforms:label>Boolean:</xforms:label>
      </xforms:output>
      <br/>
      <xforms:output ref="instance('instance')/Boolean/@value">
        <xforms:label>Boolean/@value:</xforms:label>
      </xforms:output>
      <br/>
      <br/>


    </xhtml:body>
</xhtml:html>

Если вам не разрешено использовать атрибуты для вашего узла xml, тогда используйте логические значения, пока пользователь работает с формой.При отправке события вы можете установить логическое значение Да или Нет и отправить данные во внешнюю систему.

...