【问题标题】:How to implement datatable xbl control to Orbeon Form Builder Xform如何将数据表 xbl 控件实现到 Orbeon Form Builder Xform
【发布时间】:2011-05-08 12:28:12
【问题描述】:

我是 xforms 的新手 - 使用 Orbeon Form Builder 3.8 PE。我已经阅读了诸如“警报对话框”和“数据表”之类的高级 xbl 控件。这些在我的应用程序中将非常有用,但我无法弥合关于如何实现它们的知识鸿沟。

看来我需要在某处添加一个属性才能将它们放入工具箱中;或者我需要直接向 xform 添加代码。 Orbeon 示例显示了 sn-ps,这让我认为是后者/但是,这些示例与上下文无关 - 不知道哪些标签用于将这些东西夹在中间,也不知道如何在以后的操作等中引用它们。

提前致谢。 [编辑:每条评论下方的代码] 比尔

<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>

【问题讨论】:

  • 研究和实验——我在这里:
  • 我正在按照示例 wiki.orbeon.com/forms/doc/developer-guide/xbl-components/… 编辑源代码。目标是使用来自 testsvc 数据库服务的响应来填充数据表 control-3。当我插入 行时,Orbeon 抱怨 XML 格式不正确。我会尝试在此处的某个地方发布整个代码。
  • OK - 将 xf:output 替换为 xforms:output。编译好了。现在得到“Prefix testsvc has not been declared”。
  • 其他人有这方面的经验吗?可能使用不同的技术 - 即 xforms 和 javascript 之间的混合 - 来显示数据表?

标签: datatable xforms xbl orbeon


【解决方案1】:

您可以在 wiki 上找到有关 XBL 的文档,这些文档适用于手动编写 XForms 并且希望 use XBL componentswrite their own XBL component,而不是将 XBL 组件添加到 Form Builder 的人。

话虽如此,您当然可以将 XBL 组件添加到 Form Builder,但这需要您更改组件的来源,对于某些组件,甚至可能更改 Form Builder 本身。这是“高级 Orbeon Forms 开发人员”的任务,但是,嘿,谁说你不是一个,或者不会很快成为一个?只是给你一些指示:

  1. 添加到工具箱的 XBL 组件从 oxf.fb.toolbox.group.* 属性中引用。默认值在properties-form-builder.xml 中定义,您可以在自己的properties-local.xml 中覆盖它。
  2. 要在表单生成器中使用,控件需要向表单生成器提供一些元数据。例如,请参阅如何为 simple text field 完成此操作。也许最简单的 XBL 组件示例是 &lt;fr:button&gt;
  3. 如果您拥有的组件需要大量配置,不能很好地放入表单的一个单元格(例如datatable),或者甚至没有设计为适合一个单元格(例如alert dialog),请更改,也许是重要的,Form Builder 肯定是必需的。

关于在表单生成器中支持 Orbeon 数据表的想法

  1. 我们当前在表单生成器中的所有组件都绑定到一个包含一个值的节点。即使是可以显示为 2 个字段(一个用于日期,一个用于时间)的日期/时间控件,也绑定到包含 2010-11-12T10:16:36.209-08:00 形式的 xs:dateTime 的节点。对于可以保存更丰富数据的组件(例如数据表),我们需要超越这一单一组件/单一值映射。
  2. #1 中所说的绑定扩展到调用服务。 Form Builder 对服务可以返回的 XML 没有任何限制,但是 Form Builder 可以通过从服务返回的 XML 中提取单个值(而不是子树)来设置控件的值。这也需要扩展以处理更丰富的组件,例如数据表。
  3. 第一步是支持只读数据表。为了支持读写数据表,某些单元格需要能够包含其他控件,使其更像现有的网格。

【讨论】:

  • 谢谢亚历克斯;既是为了你的智慧和耐心。我已成功将数据表组件添加到工具箱中。我可以将它添加到网格上的单元格中。此时我是否必须手动添加重复、tr 和 td 来处理代码?这就是我的知识丢失的地方。我似乎无法在数据库服务和数据表控件之间建立连接。显然,该表需要从 db 服务中引用“/testsvc/response/row”节点集。
  • 比尔,你的目标并不简单,但很有趣。我在上面的“关于支持数据表的想法”下添加了一些关于支持数据表的想法。
  • 谢谢亚历克斯。您似乎在说在当前版本的 Orbeon 中不可能使用重复数据填充数据表。请让我知道这可以在您的路线图上进行。
  • Bill,澄清一下,Orbeon Forms does 中的数据表支持重复行。 “只是”数据表还不能从 Form Builder 中使用。如果您需要使用数据表,我建议您在 XForms 中“手动”编写表单,而不是使用 Form Builder,如果这在您的情况下是可能的。这有意义吗?
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多