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
相关产品推荐
相关产品推荐

