【问题标题】:The portability issue of form definitions in Orbeon FormsOrbeon Forms 中表单定义的可移植性问题
【发布时间】:2012-10-27 01:56:40
【问题描述】:

我将表单定义存储在基于文件系统的存储库中。存储库中的每个表单定义都有一个file-id。在 Orbeon Forms 中,表单定义由 <app name, form name> 对标识。所以我使用file-id 作为form name。我根据the persistence API编写了一个定制的持久层来桥接Orbeon Forms和存储库。

我想将表单定义从一个存储库复制/导出/导入到另一个存储库,以便共享/重用/迁移表单定义。当一个表单定义从一个存储库复制到另一个时,它的file-id 会改变,但是,表单定义中的form name 仍然是旧的。就像将普通文件复制到另一个目录或重命名一样,但文件内容没有改变。

在这种情况下,我将在持久性 URL(API) 中使用<app name, new file-id> 来访问内容中包含<app name, old file-id> 的表单定义。我的第一个问题是,在表单构建器或表单运行器中哪个标识优先?

如果持久性 URL(API) 中的 <app name, new file-id> 在表单构建器或表单运行器中优先,则可移植性将是完美的。我在表单生成器中进行了测试,保存或发布时,表单生成器将在其内容(XML)中使用<app name, old file-id>。我的第二个问题是,我们可以更改或自定义优先级吗?

【问题讨论】:

  • 我不确定您是如何将数据保存在持久层中的磁盘上的。文档ID呢?使用捆绑的资源持久层,从磁盘读取数据(并且是只读的),数据保存在一个目录层次结构中,如下所示:wiki.orbeon.com/forms/doc/developer-guide/form-runner/…
  • 表单定义和表单数据保存在不同的地方。表单数据保存在数据库中。表单定义保存为文件,每个文件都有相关的元数据,file-id就是这样的元数据之一。我觉得表单数据不是问题;关键是表单定义。
  • 见下方 Erik 的回答,还要注意 Form Builder 使用的应用名称/表单名称来自表单定义元数据,存储在表单定义文档中。所以如果你想改变应用名称/表单名称,你也应该改变表单定义。
  • 按照 avernet 的建议,document 参数有效。发布表单时,我的持久层使用document 参数而不是元数据中的form name
  • 所以,我想一个解决方案,如果您希望应用程序/表单名称与文件名称匹配,则为: 1. 在您的持久层中,当保存/读取数据时,使用应用程序XML 文档中的 /form 名称,而不是文档 ID。 2. 复制/重命名表单时,还要更改 XML 文档中的表单/应用程序名称。这是你在想的吗? (或者当然,您可以放弃将应用程序/表单名称用作文件名,而使用文档 ID,这会使一切变得更简单。)

标签: portability orbeon


【解决方案1】:

作为参考,API 记录在 here,属性和术语记录在 here

为了确定使用什么持久层,Form Builder 和 Form Runner 只处理 3 个参数(我们只是让术语更加一致):

  • 应用名称
  • 表格名称
  • 资源类型(无论是表单定义还是表单数据)

配置属性(您可以在其中使用通配符)为每个应用程序/名称/资源类型组合确定要使用哪个持久层。

因此,唯一发生某种优先级的地方是持久层的配置属性级别。没有其他相关的。例如,默认属性说:

<property
  as="xs:string"
  name="oxf.fr.persistence.provider.*.*.*"
  value="exist"/>

这意味着,默认情况下,一切都通过 eXist。

但也有:

<property as="xs:string"
  name="oxf.fr.persistence.provider.orbeon.builder.form"
  value="resource"/>

<property
  as="xs:string"
  name="oxf.fr.persistence.provider.orbeon.contact.form"
  value="exist"/>

这分别意味着 Form Builder 本身的表单定义存储在 Orbeon Forms 资源中(通常在 JAR 文件中)。但是,Contact 表单的表单定义存储在 eXist 中。等等其他属性。

当 Form Builder 使用 Save 存储表单定义时,它会将它们存储为 form dataorbeon/builder app/form 名称下。当它发布表单时,它会将它们作为表单定义存储在其实际的应用程序/表单名称下。

我希望这有助于回答您的问题。

【讨论】:

    【解决方案2】:

    @avernet,在我的解决方案中,我没有在 XML 中使用 form name。我使用以下 URL 调用表单生成器:
    /orbeon/fr/orbeon/builder/edit/${fileId}
    发布时,表单生成器会调用:
    /orbeon/fr/service/my-perisit/crud/${app-name-in-xml}/${form-name-in-xml}/form/form.xhtml?document=${fileId}
    而我自定义的持久层my-persist忽略了${form-name-in-xml}参数。

    我使用/orbeon/fr/${app name}/${fileId}/new 来调用表单运行器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多