工作流模型由各种类型的一系列步骤组成。 根据类型,可以使用参数和脚本配置和扩展这些步骤,以提供所需的功能和控制。
每个步骤组件都有一个步骤属性对话框,通过该对话框可以定义和编辑所需的属性。
属性对话框的常用选项卡上的大多数工作流步骤组件都可以使用以下属性的组合:
标
题步骤的标题。
说
明步骤的说明。
工作流暂存
一个下拉选择器,用于将Stage应用到该步骤。
超时
此步骤将在其后“超时”。
您可以在以下选项之间进行选择:Off、Immediate、1h、6h、12h、24h。
超时处理程序
在步骤超时时控制工作流的处理程序;例如:
Auto Advancer
处理程序前进
选择此选项可将工作流自动前进到执行后的下一个步骤。 如果未选择,则实现脚本必须处理工作流进程。
属性对话框的用户/组选项卡上有许多工作流步骤组件,可以使用以下属性:
通过电子邮件通知用户
用户/组
AND Split在工作流中创建一个拆分,之后两个分支都将处于活动状态。 您可以根据需要向每个分支添加工作流步骤。 此步骤允许您在工作流中引入多个处理路径。 例如,您可以允许同时执行某些审阅步骤,从而节省时间。
要配置拆分,请执行以下操作:
编辑和拆分属性:
根据需要向分支添加工作流步骤。
容器步骤开始另一个作为子工作流执行的工作流模型。
此容器允许您重用工作流模型来实现常见步骤序列。 例如,翻译工作流模型可用于多个编辑工作流。
要配置该步骤,请编辑并使用以下选项卡:
容器
跳转步骤允许您指定在工作流模型中执行的下一步。 可以指定规则定义、外部脚本或ECMA脚本作为路由表达式,以评估工作流模型的下一步。
跳转步骤允许您在工作流模型中实现高级路由结构。 例如,要实现循环,可以定义跳转步骤以在工作流中执行前一步,路由表达式将评估循环条件。
要配置该步骤,请编辑并使用以下选项卡:
进程
目标步骤:在评估路由表达式的条件后选择要执行的步骤。
路由表达式:选择“规则定义”、“外部脚本”或确定是否执行目标步骤 的ECMA脚本。
模拟for循环需要保持已发生的循环迭代次数的计数:
例如,要实现在多个JCR节点上执行操作的工作流,可以使用循环计数器作为节点的索引。 要保留计数,请在工作流实例的数据映射中存储integer
值。 使用跳转步骤的脚本增加计数,并将计数与退出条件进行比较。
function check(){
var count=0;
var keyname="loopcount"
try{
if (workflowData.getMetaDataMap().containsKey(keyname)){
log.info("goto script: found loopcount key");
count= parseInt(workflowData.getMetaDataMap().get(keyname))+1;
}
workflowData.getMetaDataMap().put(keyname,count);
}catch(err) {
log.info(err.message);
return false;
}
if (parseInt(count) <7){
return true;
} else {
return false;
}
}
您还可以使用规则定义作为路由表达式来模拟for循环。 创建长 数据类型的无数变量。使用表达式作为设置变量步骤中的映射模式,在每次执行设置变量步骤时,将count变量的值设置为count + 1。
在跳转步骤中,使用设置变量作为目标步骤和计数<5作为路由表达式。
每次执行设置变量步骤时,将count变量的值重复增加1,直到值达到5。
OR Split在工作流中创建一个拆分,之后只有一个分支处于活动状态。 此步骤允许您将条件处理路径引入工作流。 您可以根据需要向每个分支添加工作流步骤。
要配置拆分,请执行以下操作:
编辑或拆分属性:
通用
分支(x)
请参阅为OR Split定义规则。
根据需要向分支添加工作流步骤。
参与者步骤允许您为特定操作分配所有权。 仅当用户手动确认该步骤后,工作流才会继续。 当您希望某人对工作流执行操作时,会使用此功能;例如,审核步骤。
尽管与操作不直接相关,但在分配操作时必须考虑用户授权;用户必须有权访问作为工作流有效负荷的页面。
要配置该步骤,请编辑并使用以下选项卡:
在以下情况下,始终会通知工作流启动器:
需要配置某些属性才能启用电子邮件通知。 您还可以自定义电子邮件模板或为新语言添加电子邮件模板。 请参阅配置电子邮件通知以在AEM中配置电子邮件通知。
使用对话框参与者步骤从分配了工作项的用户收集信息。 此步骤对于收集稍后在工作流中使用的少量数据很有用。
完成该步骤后,完成工作项对话框将包含您在对话框中定义的字段。 在字段中收集的数据存储在工作流有效负荷的节点中。 随后的工作流步骤随后可以从存储库中读取值。
要配置该步骤,请指定要将工作项分配到的组或用户,以及该对话框的路径。
要配置该步骤,请编辑并使用以下选项卡:
要创建对话框,您需要创建对话框:
您可以将构件数据存储在工作流有效负荷或工作项元数据中。 构件节点的name
属性的格式决定数据存储的位置。
使用有效负荷存储数据
要将构件数据存储为工作流有效负荷的属性,请对构件节点的name属性值使用以下格式:
./jcr:content/nodename
数据存储在有效负荷节点的nodename
属性中。 如果节点不包含该属性,则会创建该属性。
当与有效负荷一起存储时,后续使用具有相同有效负荷的对话框会覆盖属性的值。
将数据与工作项一起存储
要将构件数据存储为工作项元数据的属性,请对name属性的值使用以下格式:
nodename
数据存储在工作项metadata
的nodename
属性中。 如果对话框随后与相同的有效负荷一起使用,则保留数据。
对话框结构
对话框参与者步骤的对话框与您为创作组件创建的对话框类似。 它们存储在:
/apps/myapp/workflow/dialogs
标准触屏优化UI的对话框具有以下节点结构:
newComponent (cq:Component)
|- cq:dialog (nt:unstructured)
|- content
|- layout
|- items
|- column
|- items
|- component0
|- component1
|- ...
有关详细信息,请参阅创建和配置对话框。
对话框路径属性
对话参与者步骤具有对话路径属性(以及参与者步骤的属性)。 对话框路径属性的值是对话框dialog
节点的路径。
例如,该对话框包含在存储在节点中的名为EmailWatch
的组件中:
/apps/myapp/workflows/dialogs
对于触屏优化UI,对话框路径属性使用以下值:
/apps/myapp/workflow/dialogs/EmailWatch/cq:dialog
示例对话框定义
以下XML代码片断表示一个对话框,该对话框在有效负荷内容的watchEmail
节点中存储String
值。 标题节点表示TextField组件:
jcr:primaryType="nt:unstructured"
jcr:title="Watcher Email Address Dialog"
sling:resourceType="cq/gui/components/authoring/dialog">
<content jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/foundation/container">
<layout jcr:primaryType="nt:unstructured"
margin="false"
sling:resourceType="granite/ui/components/foundation/layouts/fixedcolumns"
/>
<items jcr:primaryType="nt:unstructured">
<column jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/foundation/container">
<items jcr:primaryType="nt:unstructured">
<title jcr:primaryType="nt:unstructured"
fieldLabel="Notification Email Address"
name="./jcr:content/watchEmails"
sling:resourceType="granite/ui/components/foundation/form/textfield"
/>
</items>
</column>
</items>
</content>
</cq:dialog>
在触屏优化UI中,此示例将生成如下对话框:
动态参与者步骤组件与参与者步骤类似,不同之处在于在运行时自动选择参与者。
要配置该步骤,请选择参与者选择器,该选择器标识要将工作项分配到的参与者,以及一个对话框。
要配置该步骤,请编辑并使用以下选项卡:
参与者选择器
对话框
您创建参加者选择器。 因此,您可以使用任何选择逻辑或条件。 例如,参加者选择器可以选择工作项最少的用户(在组内)。 您可以创建任意数量的参与者选择器,以便与工作流模型中动态参与者步骤组件的不同实例一起使用。
创建OSGi服务或ECMAScript,它选择用户将工作项分配给该用户。
ECMAscript
脚本必须包含一个名为getParticipant的函数,该函数将用户ID返回为String
值。 将自定义脚本存储在/apps/myapp/workflow/scripts
文件夹或子文件夹中。
标准AEM实例中包含一个示例脚本:
/libs/workflow/scripts/initiator-participant-chooser.ecma
您必须不要更改/libs
路径中的任何内容。
这是因为下次升级实例时,/libs
的内容会被覆盖(应用修补程序或功能包时,可能会被覆盖)。
此脚本选择工作流发起者作为参加者:
function getParticipant() {
return workItem.getWorkflow().getInitiator();
}
工作流发起者参与者选择器组件扩展了动态参与者步骤并使用此脚本作为步骤实现。
OSGi服务
服务必须实现com.day.cq.workflow.exec.ParticipantStepChooser接口。 接口定义以下成员:
SERVICE_PROPERTY_LABEL
字段:使用此字段可指定参加者选择器的名称。该名称显示在动态参与者步骤属性中可用参与者选择器的列表中。
getParticipant
方法:将动态解析的主体id返回为 String
值。
getParticipant
方法返回动态解析的Principal id。 这可以是组ID或用户ID。
但是,当返回参加者的列表时,组ID只能用于参加者步骤。 对于动态参与者步骤,将返回空列表,这不能用于委派。
要使您的实现对动态参与者步骤组件可用,请将您的Java类添加到导出服务的OSGi捆绑包,并将捆绑包部署到AEM服务器。
随机参 加者选择是选择随机用户()的示 com.day.cq.workflow.impl.process.RandomParticipantChooser
例服务。随机参与者选择 r步骤组件范例扩展了动态参与者步骤并将此服务用作步骤实现。
以下Java类实现ParticipantStepChooser
接口。 该类返回启动工作流的参加者的姓名。 代码使用的逻辑与示例脚本(initiator-participant-chooser.ecma
)使用的逻辑相同。
@Property
注释将SERVICE_PROPERTY_LABEL
字段的值设置为Workflow Initiator Participant Chooser
。
package com.adobe.example;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.ParticipantStepChooser;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.metadata.MetaDataMap;
@Component
@Service
@Properties({
@Property(name = Constants.SERVICE_DESCRIPTION, value = "An example implementation of a dynamic participant chooser."),
@Property(name = ParticipantStepChooser.SERVICE_PROPERTY_LABEL, value = "Workflow Initiator Participant Chooser (service)") })
public class InitiatorParticipantChooser implements ParticipantStepChooser {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public String getParticipant(WorkItem arg0, WorkflowSession arg1,
MetaDataMap arg2) throws WorkflowException {
String initiator = arg0.getWorkflow().getInitiator();
logger.info("Assigning Dynamic Participant Step work item to {}",initiator);
return initiator;
}
}
在动态参与者步骤属性对话框中,参与者选择器列表包含表示此服务的项Workflow Initiator Participant Chooser (script)
。
启动工作流模型时,日志会指示启动工作流的用户的ID以及为工作项分配的用户。 在此示例中,admin
用户启动了工作流。
13.09.2015 15:48:53.037 *INFO* [10.176.129.223 [1347565733037] POST /etc/workflow/instances HTTP/1.1] com.adobe.example.InitiatorParticipantChooser Assigning Dynamic Participant Step work item to admin
打开工作项时,表单参与者步骤显示表单。 当用户填写并提交表单时,字段数据存储在工作流有效负荷的节点中。
要配置该步骤,请指定要将工作项分配给的组或用户,以及表单的路径。
本节介绍页面创作基础组件](/docs/experience-manager-65/sites-authoring/default-components-foundation.html?lang=zh-Hans#form)的[Forms部分。
要配置该步骤,请编辑并使用以下选项卡:
创建表单以正常与表单参与者步骤一起使用。 但是,表单参与者步骤的表单必须具有以下配置:
Form 组件的开始必须将操作类型属性设置为Edit Workflow Controlled Resource(s)
。
Form 组件的开始必须具有Form Identifier
属性的值。
表单组件必须将元素名称属性设置为存储字段数据的节点的路径。 路径必须在工作流有效负荷内容中找到节点。 该值使用以下格式:
./jcr:content/path_to_node
表单必须包含工作流提交按钮组件。 您不配置组件的任何属性。
工作流的要求决定了您应将字段数据存储在何处。 例如,字段数据可用于配置页面内容的属性。 元素名称属性的以下值将字段数据存储为jcr:content
节点的redirectTarget
属性的值:
./jcr:content/redirectTarget
在以下示例中,字段数据用作有效负荷页面上Text组件的内容:
./jcr:content/par/text_3/text
第一个示例可用于cq:Page
组件呈现的任何页面。 第二个示例仅在有效负荷页包含ID为text_3
的Text组件时才可用。
表单可以位于存储库中的任意位置,但必须授权工作流用户读取表单。
随机参与者选择器步骤是参与者选择器,它将生成的工作项分配给从列表随机选择的用户。
要配置该步骤,请编辑并使用以下选项卡:
参数
工作流发起者参与者选择器步骤是一个参与者选择器,它将生成的工作项分配给启动工作流的用户。 除了Common属性外,没有其他属性可进行配置。
要配置该步骤,请使用以下选项卡进行编辑:
处理步骤执行ECMAScript或调用OSGi服务以执行自动处理。
要配置该步骤,请编辑并使用以下选项卡:
进程
流程:要执行的进程实现。使用下拉菜单选择ECMAScript或OSGi服务。 有关:
处理程序高级:选择此选项可将工作流自动前进到执行后的下一个步骤。如果未选择,则实现脚本必须处理工作流进程。
参数:要传递给该进程的参数。
设置变量步骤允许您设置变量的值并定义值的设置顺序。 变量按变量映射在设置变量步骤中的列出顺序设置。
要配置该步骤,请编辑并使用以下选项卡:
映射
选择变量: 使用此选项可选择变量以设置其值。
选择映射模 式:选择映射模式以设置变量值。根据变量的数据类型,您可以使用以下选项设置变量的值:
指定值: 指定要映射到变量的值。在此字段中指定的值取决于映射模式。
添加映射: 使用此选项可添加更多映射以设置变量的值。