动态添加字段到共享表单

Adding fields dynamically to Share form

我想为每个添加到 alfresco 附加包项目中的文件添加一个文本字段,以写关于每个文件的注释,可以吗?

我已经实现了一些可以在您的用例中重复使用的东西。

您可以定义具有多个值的 属性,其中将包含与每个附件关联的注释列表。

post 具有多个值的 属性 有一个简单的技巧:将“[]”添加到 属性 的名称。例如:

<input id="template_x002e_edit-metadata_x002e_edit-metadata_x0023_default_prop_someco_notes_0" 
    name="prop_someco_notes[]" 
    tabindex="0" 
    type="text" 
    value="Meeting minutes" 
    title="Notes"
    noderef="workflow://...."
    >

<input id="template_x002e_edit-metadata_x002e_edit-metadata_x0023_default_prop_someco_notes_1" 
    name="prop_someco_notes[]" 
    tabindex="1" 
    type="text" 
    value="Meeting minutes" 
    title="Notes"
    noderef="workflow://...."
>

如您所见,输入的名称以[]结尾。两个输入文本字段具有相同的名称。

Alfresco 表单引擎会将这两个输入视为具有多个值的 属性 的值:"someco:notes".

更大的问题是您需要使用一些智能 javascript 和免费标记模板生成此 html。

您可以编写一个自定义的免费标记模板来呈现初始 html:如果用户打开一个已经附加了文档的任务,您将需要使用自定义控件生成输入列表(当然可以从textfield.ftl开始)。

生成初始列表并不容易,因为不幸的是 Alfresco returns 值列表作为单个逗号分隔值。

您可以自定义在免费标记模板中注入模型的网络脚本 "org.alfresco.web.scripts.forms.FormUIGet" 以传递数组而不是 csv。

一个更快更脏的解决方案是拆分 csv 值。在 share-config-custom.xml 中,您可以指定 textfield.ftl show 用作分隔符而不是逗号。

当用户从adds/remove元素中打包时,可以拦截更新和add/remove相应的注释。请注意,我已将字段 "noderef" 添加到每个输入,因此可以了解注释与包中节点之间的关系。

更新: 对于关联(例如用于定义工作流任务中的包),Share 使用名为 "object finder"(或 "object picker")的 javascript 库。该库会触发一个名为 "formValueChanged" 的事件,您可以拦截该事件:

        YAHOO.Bubbling.fire("formValueChanged",
        {
           eventGroup: this,
           addedItems: addedItems,
           removedItems: removedItems,
           selectedItems: selectedItems,
           selectedItemsMetaData: Alfresco.util.deepCopy(this.selectedItems)
        });