用多个数据源替换嵌入式视图

时间:2014-08-12 18:06:24

标签: xpages

我正在构建一个应用程序,该应用程序将具有父文档,其中最多有5个不同的子文档附加到父文档。每个父母可以拥有5种儿童文件中的每一种,只有1种。

在传统的笔记编程中,我可能会在父文档表单中放置一个嵌入式视图。当我想知道在具有多个数据源的Xpage的Xpages中是否会做得更好时,我开始走这条路。

一个复杂的因素是每个表单/数据源都拥有一组不同的人 - 只有他们可以创建或编辑它。但我不认为这会是一个问题。

2 个答案:

答案 0 :(得分:2)

要考虑的一些想法......

  • 不要使用响应文档...通过文档密钥(如unid
  • )将相关文档绑定在一起
  • 将五个子文档的创建/编辑功能放在各自独立的面板中...... childpanel1,childpanel2等。
  • 在相应的面板中添加子文档的数据源... childdoc1,childdoc2等
  • 通过每个面板的acl属性限制编辑权限
  • 在XPage上使用多个数据源的
  • 记得为childdoc数据源设置ignoreRequestParams =“true”

例如,这是第一个子doc的面板结构:

    <xp:panel id="childpanel1">
    <xp:this.data>
        <xp:dominoDocument var="childdoc1" formName="ChildForm1"
            ignoreRequestParams="true">
        </xp:dominoDocument>
    </xp:this.data>
    <xp:this.acl>
        <xp:acl>
            <xp:this.entries>
                <xp:aclEntry type="GROUP" name="doc1group" right="EDITOR">
                </xp:aclEntry>
            </xp:this.entries>
        </xp:acl>
    </xp:this.acl>
</xp:panel>

有关ignoreRequestParams的更多内容:

在涉及“查看”XPage和“文档”XPage的两页应用程序中,当应用程序用户单击视图页面上的链接以在文档页面上打开文档时,将打开要打开的文档的ID使用REQUEST参数。您可以在文档页面的结果URL中看到这一点,该文档页面将打开要附加到URL地址的文档的ID,例如:

&documentId=49530CA58D17CCE5852575150069D857&action=openDocument  

当文档页面只有一个Domino文档数据源时,这非常有效。但是,在嵌入式视图应用程序中,“document”XPage还将包含xp:viewPanel的数据源。如果对于Domino视图数据源(以及页面上的任何其他其他数据源,例如childdoc1),ignoreRequestParams不为true,则会评估请求中传递的参数以确定要在xp:viewPasnel中显示的视图条目。这些请求参数指向的UNID不是视图所需的数据源,因此不会显示任何视图条目。

注意,对于XPage上的所有数据源,您可能不需要将ignoreRequestParams设置为true ...只需要知道此设置以及当其中一个视图或文档数据源出现问题时它会做什么页面。

答案 1 :(得分:1)

不确定您的问题是如何限制表单创建或如何在xPages中使用嵌入式视图。在xPages中,两者都更容易。

基本上你只需要让父母对孩子做出回应。我更喜欢不使用普通的响应文档,而是更喜欢将一个名为uid的字段与父项的unid一起添加到子项中。然后我过滤我的数据源以匹配父文档的uid。您可以使用视图控件,但重复看起来更好。

它是开始使用对话框的好地方,因为您可以在对话框中拥有第二个数据源,用户永远不需要离开页面。

就限制视图创建而言,您可以执行类似隐藏按钮以根据条件创建新子项的操作。

此操作会将document1的unid添加到document3

<xp:modifyField name="uid"
    value="#{javascript:document1.getDocument().getUniversalID()}"  var="document3">
</xp:modifyField>

这是我用于重复控制数据源的代码。该视图按照uid字段分类

<xp:dominoView var="view7" viewName="VIEWNAME"
        keys="#{javascript:document1.getDocument().getUniversalID()}">
    </xp:dominoView>

然后重复控件只会抓取你想要的字段。

<xp:table styleClass="table">
                <xp:tr>
                    <xp:td>Column Header</xp:td>
                    <xp:td>Column Header</xp:td>
                    <xp:td>Column Header</xp:td>
                </xp:tr>

                <xp:repeat id="repeat3" rows="30" value="#{view7}"
                    var="rowData">
                    <xp:tr>
                        <xp:td>
                            <xp:text escape="true"
                                id="computedField3" value="#{rowData.columnname1}">
                            </xp:text>
                        </xp:td>
                        <xp:td>
                            <xp:text escape="true"
                                id="computedField4" value="#{rowData.columnname2}">
                            </xp:text>
                        </xp:td>
                        <xp:td>
                            <xp:text escape="true"
                                id="computedField5" value="#{rowData.columnname3}">
                            </xp:text>
                        </xp:td>
                    </xp:tr>
                </xp:repeat>
            </xp:table>

忽略一些样式,因为我正在使用bootstrap。