Как реализовать управляемый данными элемент управления xbl в Orbeon Form Builder Xform - PullRequest
1 голос
/ 11 ноября 2010

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

Кажется, либо мне нужно добавить свойство где-нибудь, чтобы получить их в наборе инструментов; или мне нужно напрямую добавить код в 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>

1 Ответ

2 голосов
/ 11 ноября 2010

Документация по 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. Если имеющийся у вас компонент требует значительной конфигурации, он плохо помещается в одну ячейку формы (например, с датой ) или даже не предназначен для размещения в одной ячейке (например, ) диалоговое окно с предупреждением ), наверняка потребуются изменения, возможно существенные, в Form Builder.

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

  1. Все компоненты, которые у нас есть в настоящее время в Form Builder, связаны с одним узлом, который содержит одно значение. Даже элемент управления датой / временем, который может отображаться как 2 поля, одно для даты и одно для времени, привязан к узлу, который содержит xs:dateTime формы 2010-11-12T10:16:36.209-08:00. Нам нужно выйти за рамки этого однокомпонентного / одного сопоставления значений для компонентов, которые могут содержать более богатые данные, например, данные.
  2. То, что было сказано для привязки в # 1, распространяется на службы вызова. Form Builder не накладывает никаких ограничений на то, что XML может возвращать служба, но затем Form Builder может просто установить значение элементов управления, извлекая отдельные значения (не поддеревья) из XML, возвращаемого службой. Это тоже нужно будет расширить, чтобы иметь дело с более богатыми компонентами, такими как датируемые.
  3. Первый шаг - поддержка данных только для чтения. Для поддержки чтения и записи данных определенные ячейки должны будут содержать другие элементы управления, что делает его более похожим на существующую сетку.
...