Orbeon: экземпляр readony, влияющий на ссылки формы в зависимости от положения в модели по отношению к другим экземплярам

Наткнулся на странный дефект. Я использую Orbeon 3.9 CE на Tomcat. В зависимости от значения текстового поля='true' ссылка будет показана как на скриншоте. Обратите внимание, что триггер относится к «безопасному для данных» экземпляру для отображения и скрытия.

<xforms:trigger appearance="minimal" ref=".[instance('data-safe')/data-safe='true']">
    <xforms:label>
        Add
    </xforms:label>
</xforms:trigger>

Вот как должен выглядеть экран.
ожидаемая функциональность

Теперь, как часть улучшения производительности, у меня есть экземпляр с атрибутом xxforms:readonly="true"

1-й экземпляр только для чтения

Здесь 1-й экземпляр доступен только для чтения

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

теперь, если я изменю порядок экземпляра только для чтения с 1-й позиции в модели где-то ниже. как показано только для чтения перемещено ниже

ссылка добавления становится активной
ожидаемая функциональность

вот пример кода для объяснения проблемы

  <xhtml:head>

    <xhtml:title>SO question</xhtml:title>
    <!-- CSS StyleSheet test-->

    <!-- Link to the Model goes Here -->
    <!-- Needs exslt to do some fancy things with Dates and Time -->
    <xforms:model id="model">

        <!-- -->
        <!-- Places Instances Here -->
        <!-- -->


        <xforms:instance id="dropdown-values"   src="oxf:/apps/TSDM/global_instances/Dropdown-Values.xml" xxforms:readonly="true"/>

        <xforms:instance id="form-attributes">
            <attributes>
                <form-global>
                    <current-page>1</current-page> <!-- Always starts on 1 -->
                    <previous-page></previous-page> <!-- Always starts on 1 -->
                    <next-page></next-page> <!-- Always starts on 1 -->
                    <first-page>1</first-page> <!-- First Page Boundary: 1 always -->
                    <last-page>12</last-page> <!-- Last Page Boundary: Change based on form -->
                    <summary>false</summary> <!-- Enable Summary View indicator -->
                </form-global>
            </attributes>
        </xforms:instance>

        <xforms:instance id="data-safe">
            <flag>
                <data-safe>true</data-safe>
                <data-safe1></data-safe1>
            </flag>
        </xforms:instance>

    <xforms:bind id="group-level-specifications-credit-effective-end-date" nodeset="instance('data-safe')/data-safe"
                    calculate="."
                    readonly="false()"/>


    <!--xforms:bind nodeset="instance('data-safe')/data-safe1" type="xforms:date"
                    calculate="months(xforms:dayTimeDuration(../data-safe))"
                    readonly="false()"/-->

    </xforms:model>


</xhtml:head>
<!-- End of Head -->



<!-- Start of the Body of the Page -->
<xhtml:body class="MainBODY">

    <xforms:switch>
        <xforms:case>
            <xforms:trigger appearance="minimal" ref=".[instance('data-safe')/data-safe='true']">
                <xforms:label>
                    Add
                </xforms:label>

            </xforms:trigger>
        </xforms:case>
    </xforms:switch>
    <xforms:input ref="instance('data-safe')/data-safe" />
    <br/>
    <xforms:input ref="instance('data-safe')/data-safe1" />


</xhtml:body>

person Naveen Babu    schedule 24.01.2012    source источник
comment
@KaipaMSarma, я думаю, это ошибка Орбеона. Поэтому я не думаю, что тег xforms нужен.   -  person Naveen Babu    schedule 26.01.2012


Ответы (1)


Когда вы пишете <xforms:trigger ref=".[some condition]">, вы не только скрываете триггер, когда условие ложно, вы также привязываете его к любому узлу, на который указывает .. Если ваш триггер не находится внутри какого-либо элемента контейнера (<xforms:group>, …), который изменяет контекст, контекст является корневым элементом первого экземпляра. Когда триггер привязан к узлу:

  1. Триггер не будет отображаться, если узел неактуален.
  2. Триггер отображается как отключенный, если узел доступен только для чтения.

Вы находитесь во втором случае не из-за <xforms:bind readonly="false()"/> в вашем коде, а потому, что когда вы помещаете xxforms:readonly="true" в экземпляр, все его узлы помечаются как доступные только для чтения.

Решение в вашем случае простое: переместите этот экземпляр как второй, как вы сделали, или привяжите триггер к другому узлу, который не доступен только для чтения, используя другое выражение XPath вместо ..

person avernet    schedule 24.01.2012
comment
ты не правильно понял мой вопрос. триггер не привязан к этому экземпляру только для чтения. но экземпляр после этого экземпляр только для чтения в модели. и в зависимости от положения экземпляра только для чтения триггеры, связанные с другими экземплярами, ведут себя как только для чтения. пожалуйста, посмотрите скриншот - person Naveen Babu; 25.01.2012
comment
@NaveenBabu Не могли бы вы отредактировать свой вопрос, включив в него минимальный пример, который я могу запустить здесь, чтобы воспроизвести это? - person avernet; 25.01.2012
comment
пример кода уже есть, так как последняя часть вопроса здесь представляет собой пример кода для объяснения проблемы - person Naveen Babu; 26.01.2012
comment
@NaveenBabu А, извини, я не видел, чтобы это был полный пример. Я запустил его и вижу триггер только для чтения. Но это потому, что он привязан к первому экземпляру, который доступен только для чтения. Измените . на instance('form-attributes'), чтобы он был привязан ко второму экземпляру, который не предназначен только для чтения, и триггер не будет отображаться как отключенный. - person avernet; 27.01.2012
comment
общий синтаксис был <xforms:trigger ref=".[some condition]">, но, согласно вашему комментарию, можем ли мы изменить синтаксис на <xforms:trigger appearance="minimal" ref="<condition>">, поскольку этот код работает нормально <xforms:trigger appearance="minimal" ref="instance('data-safe')/data-safe='true'">. Я хочу передать синтаксис моей команде, чтобы избежать этой проблемы. Тем более проблема указана, дефект орбеона? Поскольку порядок расположения экземпляров в модели влияет на функциональность. - person Naveen Babu; 30.01.2012
comment
Не думаю, что мне удалось объяснить, что делает ref=".[<condition>]". Он не сообщает движку XForms, что триггер только <condition> является истинным. Или, по крайней мере, не напрямую. ref привязывает триггер к узлу, и этот узел получается механизмом XForms путем оценки выражения XPath. Выражение XPath .[<condition>] означает текущий узел, если встречается <condition>, иначе ничего (пустая последовательность). - person avernet; 01.02.2012
comment
И если вы ни к чему не привязываете элемент управления, то этот элемент управления не отображается в соответствии со спецификацией XForms. Таким образом, вы либо привязываете триггер к текущему узлу, если <condition> истинно, либо ни к чему, что скрывает элемент управления, если <condition> ложно. Есть ли смысл до сих пор? - person avernet; 01.02.2012
comment
Если это имеет смысл, я думаю, теперь вы понимаете, почему, если <condition> истинно, а текущий узел доступен только для чтения, тогда триггер становится доступным только для чтения, т. е. отображается как отключенный. Теперь, если вместо ref=".[<condition>]" вы напишете ref="<condition>", выражение XPath всегда будет возвращать значение; он никогда не вернет пустую последовательность, поэтому триггер всегда будет отображаться. - person avernet; 01.02.2012
comment
Вы можете вернуть значение, которое не является текущим узлом, если встречается <condition>, и пустую последовательность, если это не так, например: ref="if (<condition>) then 42 else (), где 42 является фиктивным значением. Вы можете использовать true() вместо 42, чтобы это выглядело менее странно. - person avernet; 01.02.2012