Есть ли способ избежать того, чтобы Orbeon Form Builder выполнял события в коде формы?

Этот вопрос связан с предыдущим вопросом в Stackoverflow, где предлагается использование событий для создания соответствующих зависимостей между элементами.

Пример кода, в котором у меня есть один раздел с одним вопросом:

<xh:html xmlns:xh="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:exf="http://www.exforms.org/exf/1-0" xmlns:fb="http://orbeon.org/oxf/xml/form-builder" xmlns:fr="http://orbeon.org/oxf/xml/form-runner" xmlns:saxon="http://saxon.sf.net/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sql="http://orbeon.org/oxf/xml/sql" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xxf="http://orbeon.org/oxf/xml/xforms" xmlns:xxi="http://orbeon.org/oxf/xml/xinclude">
    <xh:head>
        <xh:meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
        <xh:title>StackOverflow</xh:title>
        <xf:model id="fr-form-model" xxf:expose-xpath-types="true">
            <xf:instance id="fr-form-metadata" xxf:exclude-result-prefixes="#all" xxf:readonly="true">
                <metadata>
                    <application-name>WebForms</application-name>
                    <form-name>StackOverflow_v1</form-name>
                    <title xml:lang="en">StackOverflow</title>
                    <description xml:lang="en">Version: 1. Modification date: 2015-06-10 10:18:18. Publication date: 2015-06-10 10:18:18.</description>
                </metadata>
            </xf:instance>
            <xf:instance id="fr-form-instance">
                <form>
                    <Category>
                        <Question/>
                    </Category>
                </form>
            </xf:instance>
            <xf:bind id="fr-form-binds" ref="instance('fr-form-instance')">
                <xf:bind id="Category-bind" name="Category" ref="/form/Category">
                    <xf:bind id="Question-bind" name="Question" ref="Question" required="true()"/>
                </xf:bind>
            </xf:bind>
            <xf:instance id="fr-form-attachments">
                <attachments>
                    <css filename="" mediatype="text/css" size=""/>
                    <pdf filename="" mediatype="application/pdf" size=""/>
                </attachments>
            </xf:instance>
            <xf:instance id="fr-form-resources" xxf:readonly="false">
                <resources>
                    <resource xml:lang="en">
                        <Category>
                            <label><![CDATA[Category]]></label>
                            <hint/>
                            <alert/>
                            <Question>
                                <label><![CDATA[Question]]></label>
                                <hint/>
                                <alert/>
                                <item>
                                    <label><![CDATA[Answer]]></label>
                                    <hint/>
                                    <value><![CDATA[Answer]]></value>
                                </item>
                                <item>
                                    <label><![CDATA[Answer2]]></label>
                                    <hint/>
                                    <value><![CDATA[Answer2]]></value>
                                </item>
                            </Question>
                        </Category>
                    </resource>
                </resources>
            </xf:instance>
            <xf:instance id="fr-service-request-instance" xxf:exclude-result-prefixes="#all">
                <request/>
            </xf:instance>
            <xf:instance id="fr-service-response-instance" xxf:exclude-result-prefixes="#all">
                <response/>
            </xf:instance>
            <!-- Keep track of visible/hidden status -->
            <xf:instance id="visible">
                <var>
                    <Category>0</Category>
                    <Question>false</Question>
                </var>
            </xf:instance>
            <!-- Change the visibility status for 'Question2'. -->
            <xf:setvalue event="xforms-enabled" observer="Question-control" ref="instance('visible')/Question" value="'true'"/>
            <xf:setvalue event="xforms-disabled" observer="Question-control" ref="instance('visible')/Question" value="'false'"/>
            <!-- Update category showed elements count for 'Question2'. -->
            <xf:setvalue event="xforms-enabled" observer="Question-control" ref="instance('visible')/Category" value="instance('visible')/Category + 1"/>
            <xf:setvalue event="xforms-disabled" observer="Question-control" ref="instance('visible')/Category" value="instance('visible')/Category - 1"/>
        </xf:model>
    </xh:head>
    <xh:body>
        <fr:view>
            <fr:body xmlns:dataModel="java:org.orbeon.oxf.fb.DataModel" xmlns:oxf="http://www.orbeon.com/oxf/processors"
                     xmlns:p="http://www.orbeon.com/oxf/pipeline" xmlns:xbl="http://www.w3.org/ns/xbl">
                <fr:section bind="Category-bind" class="webforms-element webforms-category" id="Category-control">
                    <xf:label mediatype="text/html" ref="instance('fr-form-resources')/resource/Category/label"/>
                    <xf:hint ref="instance('fr-form-resources')/resource/Category/hint"/>
                    <xf:alert ref="instance('fr-form-resources')/resource/Category/alert"/>
                    <xh:tr>
                        <xh:td>
                            <xf:select1 appearance="full" bind="Question-bind" class="webforms-element webforms-question" id="Question-control">
                                <xf:label mediatype="text/html" ref="instance('fr-form-resources')/resource/Category/Question/label"/>
                                <xf:hint ref="instance('fr-form-resources')/resource/Category/Question/hint"/>
                                <xf:alert ref="instance('fr-form-resources')/resource/Category/Question/alert"/>
                                <xf:itemset class="webforms-element webforms-answer" ref="instance('fr-form-resources')/resource/Category/Question/item">
                                    <xf:label ref="label"/>
                                    <xf:value ref="value"/>
                                    <xf:hint ref="hint"/>
                                </xf:itemset>
                            </xf:select1>
                        </xh:td>
                    </xh:tr>
                </fr:section>
            </fr:body>
        </fr:view>
    </xh:body>
</xh:html>

Как прокомментировано в предыдущем посте, есть два события для сохранения статуса вопроса (если он виден или нет), и я добавил дополнительное событие для подсчета количества видимых элементов в категории. Важный фрагмент кода находится здесь:

<xf:instance id="visible">
    <var>
         <Category>0</Category>
         <Question>false</Question>
    </var>
</xf:instance>

Если я вставлю весь пример в Orbeon builder версии 4.9 и снова открою его в редакторе исходного кода, код изменится на:

<xf:instance id="visible">
    <var>
         <Category>1</Category>
         <Question>true</Question>
    </var>
</xf:instance>

Похоже, Orbeon Builder запускает события и изменяет значения переменных только путем вставки кода и отображения результата в дизайнере. Поэтому при сохранении в базу данных и публикации формы окончательное значение этих переменных будет последним. Специально счетчик категории, который увеличивается на единицу каждый раз, когда я редактирую исходный код!

Я предполагаю, что это нежелательное поведение в конструкторе форм (но оно есть в средстве выполнения форм), и поэтому возникает вопрос: могу ли я отключить выполнение событий в конструкторе форм?


person King Midas    schedule 10.06.2015    source источник
comment
В качестве обходного пути я вставляю код прямо в базу данных и пропускаю Конструктор форм.   -  person King Midas    schedule 10.06.2015


Ответы (1)


Оказывается, это регрессия Form Builder, представленного в Orbeon Forms 4.8. Проблема № 2261 устранена.

person ebruchez    schedule 10.06.2015