Как внедрить элемент управления xbl с данными в Orbeon Form Builder Xform

Я новичок в xforms - использую Orbeon Form Builder 3.8 PE. Я читал о расширенных элементах управления xbl, таких как «Диалоговое окно предупреждений» и «Таблица данных». Это было бы очень полезно в моем приложении, но я не могу преодолеть пробел в своих знаниях о том, как их реализовать.

Кажется, мне нужно где-то добавить свойство, чтобы получить их на панели инструментов; или мне нужно напрямую добавить код в xform. Примеры Orbeon показывают фрагменты, которые заставляют меня думать, что это последнее. Однако примеры вырваны из контекста - понятия не имею, какие теги используются для объединения этих вещей или как ссылаться на них позже в действиях и тому подобное.

Заранее спасибо. [РЕДАКТИРОВАТЬ: код ниже для каждого комментария] Билл

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml"
        xmlns:xxi="http://orbeon.org/oxf/xml/xinclude"
        xmlns:xxforms="http://orbeon.org/oxf/xml/xforms"
        xmlns:exforms="http://www.exforms.org/exf/1-0"
        xmlns:fr="http://orbeon.org/oxf/xml/form-runner"
        xmlns:saxon="http://saxon.sf.net/"
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:oxf="http://www.orbeon.com/oxf/processors"
        xmlns:sql="http://orbeon.org/oxf/xml/sql"
        xmlns:xi="http://www.w3.org/2001/XInclude"
        xmlns:ev="http://www.w3.org/2001/xml-events"
        xmlns:xforms="http://www.w3.org/2002/xforms"
        xmlns:pipeline="java:org.orbeon.oxf.processor.pipeline.PipelineFunctionLibrary"
        xmlns:p="http://www.orbeon.com/oxf/pipeline"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:odt="http://orbeon.org/oxf/xml/datatypes"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xhtml:head>
    <xhtml:title>Operations</xhtml:title>
    <xforms:model id="fr-form-model">


        <xforms:instance id="fr-form-instance">
            <form>
                <section-1>
                    <control-1/>
                    <control-2/>
                </section-1>
                <section-2/>
                    <control-3/>
            </form>
        </xforms:instance>


        <xforms:bind id="fr-form-binds" nodeset="instance('fr-form-instance')">
            <xforms:bind id="section-1-bind" nodeset="section-1">
                <xforms:bind id="control-1-bind" name="control-1" nodeset="control-1"/>
                <xforms:bind id="control-2-bind" name="control-2" nodeset="control-2"/>
            </xforms:bind>
            <xforms:bind id="section-2-bind" nodeset="section-2">
                <xforms:bind id="control-3-bind" name="control-3" nodeset="control-3"/>
            </xforms:bind>
        </xforms:bind>


        <xforms:instance id="fr-form-metadata" xxforms:readonly="true">
            <metadata>
                <application-name>KENAN_TOOLKIT</application-name>
                <form-name>operations-process</form-name>
                <title xml:lang="en">Operations</title>
                <description xml:lang="en"/>
                <author/>
                <logo mediatype="image/jpeg" filename="optimum-lightpath-logo-810x141.JPG"
                      size="14799">/fr/service/oracle/crud/orbeon/builder/data/3978eab19d9c6ccd8c65a787aa1864c4/541ca86ada859805464573ca539d6327.JPG</logo>
            </metadata>
        </xforms:instance>


        <xforms:instance id="fr-form-attachments">
            <attachments>
                <css mediatype="text/css" filename="" size=""/>
                <pdf mediatype="application/pdf" filename="" size=""/>
            </attachments>
        </xforms:instance>



        <xforms:instance id="fr-form-resources" xxforms:readonly="false">
            <resources>
                <resource xml:lang="en">
                    <section-1>
                        <label>EBF</label>
                        <help/>
                    </section-1>
                    <control-1>
                        <label/>
                        <hint/>
                        <help/>
                        <alert/>
                    </control-1>
                    <control-2>
                        <label/>
                        <hint/>
                        <help/>
                        <alert/>
                    </control-2>
                    <section-2>
                        <label>Archive</label>
                        <help/>
                    </section-2>
                    <control-3>
                        <label/>
                        <hint/>
                        <help/>
                        <alert/>
                    </control-3>
                </resource>
            </resources>
        </xforms:instance>


        <xforms:instance id="fr-service-request-instance" xxforms:exclude-result-prefixes="#all">
            <request/>
        </xforms:instance>

        <xforms:instance id="fr-service-response-instance" xxforms:exclude-result-prefixes="#all">
            <response/>
        </xforms:instance>
        <xforms:instance id="testsvc-instance" class="fr-database-service"
                         xxforms:exclude-result-prefixes="#all">
            <body>&lt;sql:config xmlns:sql="http://orbeon.org/oxf/xml/sql"&gt;
            &lt;sql:datasource&gt;orbeonedmDS&lt;/sql:datasource&gt;
&lt;sql:query&gt;SELECT n.node_id as id, n.node_name_tid as name, n.sw_ver as ver, m.model_name as model FROM techmgr.node n, techmgr.model m WHERE n.model_id = m.model_id  and rownum between 0 and 100&lt;/sql:query&gt;

        &lt;/sql:config&gt;</body>
        </xforms:instance>
        <xforms:submission id="testsvc-submission" class="fr-database-service"
                           ref="instance('fr-service-request-instance')"
                           resource="/fr/service/custom/orbeon/database"
                           method="post"
                           serialization="application/xml"
                           replace="instance"
                           instance="fr-service-response-instance"/>
        <xforms:action id="pop-test-binding">

            <xforms:action ev:event="xforms-ready" ev:observer="fr-form-model">

                <xforms:send submission="testsvc-submission"/>
            </xforms:action>

            <xforms:action ev:event="xforms-submit" ev:observer="testsvc-submission">

                <xxforms:variable name="request-instance-name" select="'testsvc-instance'" as="xs:string"/>

                <xforms:insert nodeset="instance('fr-service-request-instance')"
                               origin="saxon:parse(instance($request-instance-name))"/>


                <xforms:action context="instance('fr-service-request-instance')">

                </xforms:action>
            </xforms:action>

            <xforms:action ev:event="xforms-submit-done" ev:observer="testsvc-submission"
                           context="instance('fr-service-response-instance')">

            </xforms:action>
        </xforms:action>

    </xforms:model>
</xhtml:head>
<xhtml:body>
    <fr:view>
        <xforms:label ref="instance('fr-form-metadata')/title"/>
        <fr:body>
            <fr:section id="section-1-section" bind="section-1-bind">
                <xforms:label ref="$form-resources/section-1/label"/>
                <xforms:help ref="$form-resources/section-1/help"/>
                <fr:grid columns="2">
                    <xhtml:tr>
                        <xhtml:td>
                            <xforms:input id="control-1-control" bind="control-1-bind">
                                <xforms:label ref="$form-resources/control-1/label"/>
                                <xforms:hint ref="$form-resources/control-1/hint"/>
                                <xforms:help ref="$form-resources/control-1/help"/>
                                <xforms:alert ref="$fr-resources/detail/labels/alert"/>
                            </xforms:input>
                        </xhtml:td>
                        <xhtml:td/>
                    </xhtml:tr>
                    <xhtml:tr>
                        <xhtml:td>
                            <xforms:input id="control-2-control" bind="control-2-bind">
                                <xforms:label ref="$form-resources/control-2/label"/>
                                <xforms:hint ref="$form-resources/control-2/hint"/>
                                <xforms:help ref="$form-resources/control-2/help"/>
                                <xforms:alert ref="$fr-resources/detail/labels/alert"/>
                            </xforms:input>
                        </xhtml:td>
                        <xhtml:td/>
                    </xhtml:tr>

                </fr:grid>
            </fr:section>
            <fr:section id="section-2-section" bind="section-2-bind">
                <xforms:label ref="$form-resources/section-2/label"/>
                <xforms:help ref="$form-resources/section-2/help"/>
                <fr:grid columns="1">
                    <xhtml:tr>
                        <xhtml:td>
                            <fr:datatable scrollable="both" width="800px" height="500px">
                                <thead>
                                    <tr>
                                        <th fr:sortable="true" fr:resizeable="true">ID</th>
                                        <th fr:sortable="true" fr:resizeable="true">Name</th>
                                        <th fr:sortable="true" fr:resizeable="true">Version</th>
                                        <th fr:sortable="true" fr:resizeable="true">Model</th>
                                    </tr>
                                </thead>
                                <tbody>
                                 <xforms:repeat nodeset="/testsvc:response/testsvc:row"> 
                                  <tr>
                                   <td>
                                    <xf:output value=""/>
                                   </td>
                                   <td>
                                   </td>
                                   <td>
                                   </td>
                                   <td>
                                   </td>
                                  </tr>
                                 </xforms:repeat>
                                </tbody>
                           </fr:datatable>
                        </xhtml:td>
                    </xhtml:tr>
                </fr:grid>
            </fr:section>
        </fr:body>
    </fr:view>
</xhtml:body>


person Bill Dolan    schedule 11.11.2010    source источник
comment
Исследования и эксперименты - вот где я:   -  person Bill Dolan    schedule 11.11.2010
comment
Я редактирую исходник по примеру wiki.orbeon.com/ form/doc/developer-guide/xbl-components/ . Цель состоит в том, чтобы использовать ответ службы базы данных testvc для заполнения datatable control-3. Когда я вставляю строку ‹xf:output /›, Orbeon жалуется на неправильно сформированный XML. Я постараюсь опубликовать весь код где-нибудь здесь.   -  person Bill Dolan    schedule 11.11.2010
comment
ОК - заменил xf:output на xforms:output. Скомпилировано нормально. Теперь получение префикса testvc не объявлено.   -  person Bill Dolan    schedule 11.11.2010
comment
Есть ли у кого-нибудь еще опыт в этом? Возможно, с использованием другой технологии — т. е. гибрида между xforms и javascript — для отображения таблицы данных?   -  person Bill Dolan    schedule 23.11.2010


Ответы (1)


Документация по XBL, которую вы найдете на вики, предназначена для людей, которые пишут XForms вручную и хотят либо используйте компоненты XBL или напишите свой собственный XBL-компонент, а не добавляйте XBL-компоненты в Form Builder.

При этом вы, безусловно, можете добавить XBL-компоненты в Form Builder, но для этого потребуется изменить источник компонентов, а для некоторых компонентов, возможно, даже изменить сам Form Builder. Это задача для «продвинутых разработчиков Orbeon Forms», но кто сказал, что вы не являетесь одним из них или не станете им очень быстро? Просто чтобы дать вам несколько советов:

  1. На компоненты XBL, добавленные в набор инструментов, ссылаются из свойств oxf.fb.toolbox.group.*. Значение по умолчанию определено в properties-form-builder.xml, и вы можете переопределить это в своем собственном properties-local.xml.
  2. Чтобы элементы управления можно было использовать в Form Builder, они должны предоставить некоторые метаданные для Form Builder. Посмотрите, например, как это делается для простое текстовое поле. И, возможно, самым простым примером компонента XBL является <fr:button>.
  3. Если компонент, который у вас есть, требует значительной настройки, плохо вписывается в одну ячейку формы (например, datatable) или даже не предназначен для размещения в одной ячейке (например, alert dialog), наверняка потребуются изменения, возможно существенные, в Form Builder.

Идеи о поддержке таблицы данных Orbeon в Form Builder

  1. Все компоненты, которые у нас есть в настоящее время в Form Builder, привязаны к одному узлу, который содержит одно значение. Даже элемент управления датой/временем, который может отображаться как 2 поля, одно для даты и одно для времени, привязан к узлу, который содержит xs:dateTime формы 2010-11-12T10:16:36.209-08:00. Нам нужно будет выйти за рамки этого сопоставления одного компонента / одного значения для компонентов, которые могут содержать более богатые данные, такие как datatable.
  2. То, что было сказано о привязке в № 1, распространяется и на службы вызовов. Form Builder не накладывает никаких ограничений на то, какой XML может возвращать служба, но тогда Form Builder может просто установить значение элементов управления, извлекая отдельные значения (не поддеревья) из XML, возвращаемого службой. Это также необходимо будет расширить, чтобы иметь дело с более богатыми компонентами, такими как datatable.
  3. Первым шагом является поддержка таблицы данных только для чтения. Для поддержки чтения и записи данных определенные ячейки должны содержать другие элементы управления, что делает их более похожими на существующую сетку.
person avernet    schedule 11.11.2010
comment
Спасибо, Алекс; и за вашу мудрость и терпение. Я успешно добавил компонент данных в панель инструментов. Я могу добавить его в ячейку сетки. На данный момент мне нужно работать с кодом вручную, добавляя повторы, tr и td? Тут мои знания иссякают. Кажется, я не могу установить связь между службой базы данных и элементом управления с данными. Очевидно, что таблица должна ссылаться на набор узлов /testsvc/response/row из службы db. - person Bill Dolan; 11.11.2010
comment
Билл, то, к чему ты стремишься, не простое, но очень интересное. Я добавил несколько идей о поддержке таблицы данных в свою аннотацию выше, в разделе «Идеи о поддержке таблицы данных». - person avernet; 12.11.2010
comment
Спасибо, Алекс. Кажется, вы говорите, что таблицы данных, заполненные повторяющимися данными, невозможны в текущей версии Orbeon. Пожалуйста, дайте мне знать, где это может быть в вашей дорожной карте. - person Bill Dolan; 23.11.2010
comment
Билл, поясняю, таблица данных в Orbeon Forms поддерживает повторяющиеся строки. Просто таблицу данных еще нельзя использовать из Form Builder. Если вам нужно использовать таблицу данных, я рекомендую вам написать форму вручную, в XForms, вместо использования Form Builder, если это возможно в вашем случае. Имеет ли это смысл? - person avernet; 24.11.2010