You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alfresco Community 5.1:如何获取模板用户数据并在后续任务展示

嘿,针对你在Alfresco Community 5.1里想要把datatable-property.ftl模板中表格的用户数据传递到后续任务的需求,我结合Alfresco的工作流机制和Freemarker模板特性,整理了几个实用方案:

方案1:通过工作流任务变量传递(最直接常用)

既然你是在任务上下文的FTL模板里展示用户表格,核心思路是把表格中的用户数据绑定到工作流任务变量,这样后续任务就能直接读取这些变量。

  • 在datatable-property.ftl中,针对表格的用户数据(比如选中的用户),添加隐藏表单字段来存储关键信息(比如用户ID或NodeRef):

    <!-- 假设表格每行对应一个user对象,这里以选中用户为例 -->
    <#list tableUsers as user>
      <input type="checkbox" name="prop_selectedUserIds" value="${user.id}" />
      <span>${user.fullName}</span>
    </#list>
    

    这里的prop_selectedUserIds会被Alfresco的表单处理器自动捕获,存入当前任务的属性中。

  • 在后续任务的FTL模板里,直接引用这个任务变量来展示数据:

    <div class="user-info-section">
      <h3>之前选择的用户</h3>
      <ul>
        <#list task.properties.selectedUserIds as userId>
          <#assign user = people.getPerson(userId) />
          <li>${user.fullName} (${user.userName})</li>
        </#list>
      </ul>
    </div>
    
方案2:通过关联节点存储数据(适合大量/持久化数据)

如果需要存储的用户数据较多,或者希望数据和流程关联的文档节点绑定,可以把数据写入Alfresco Repository的节点属性中:

  • 首先需要在自定义模型中定义一个存储用户列表的属性(比如my:selectedUsers),部署模型后,通过Java后端逻辑(比如自定义工作流行为)把用户数据写入节点:

    // 获取流程关联的文档节点
    NodeRef packageNode = (NodeRef) taskInstance.getVariable("bpm_package");
    if (packageNode != null) {
        List<String> selectedUserIds = ...; // 从表格获取的用户ID列表
        QName propQName = NamespaceService.createQName("http://yourcompany.com/model/my/1.0", "selectedUsers");
        nodeService.setProperty(packageNode, propQName, (Serializable) selectedUserIds);
    }
    
  • 在后续任务的FTL模板中,读取节点属性并展示:

    <#assign packageNode = task.properties.bpm_package?first />
    <#assign selectedUserIds = nodeService.getProperty(packageNode, "my:selectedUsers") />
    <div>
      <h3>存储的用户列表</h3>
      <#if selectedUserIds?has_content>
        <ul>
          <#list selectedUserIds as userId>
            <li>${people.getPerson(userId).fullName}</li>
          </#list>
        </ul>
      <#else>
        <p>暂无选中用户</p>
      </#if>
    </div>
    
方案3:前端JS临时传递(适合同页面分步交互)

如果是在同一个页面的后续步骤(比如弹窗、分步表单),可以用JavaScript捕获表格数据并存入隐藏域,再传递到后续环节:

  • 在datatable-property.ftl的JS部分监听表格选择事件,收集用户数据:

    YUI().use('datatable', function(Y) {
        var dataTable = Y.one('.yui-dt').getDataTable();
        dataTable.on('selectionChange', function(e) {
            var selectedRows = e.newSelection;
            var userIds = selectedRows.map(row => row.get('data').userId);
            document.getElementById('hiddenUserIds').value = JSON.stringify(userIds);
        });
    });
    

    同时添加对应的隐藏域:

    <input type="hidden" id="hiddenUserIds" name="prop_selectedUsersJson" />
    
  • 后续任务模板中解析JSON格式的变量:

    <#assign selectedUsersJson = task.properties.selectedUsersJson />
    <#assign selectedUserIds = selectedUsersJson?eval />
    <div>
      <h3>选中用户信息</h3>
      <#list selectedUserIds as userId>
        <p>${people.getPerson(userId).userName}</p>
      </#list>
    </div>
    

注意事项

  • 尽量存储用户的NodeRef或用户名,避免存储复杂对象,因为Alfresco工作流变量对序列化对象有严格要求。
  • 如果使用自定义模型属性,务必确保模型已正确部署并激活。
  • 测试时可以通过Alfresco管理控制台查看任务变量或节点属性,验证数据是否正确存储。

内容的提问来源于stack exchange,提问作者Darwiin04

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:08:46