工作流模型由一系列各种类型的步骤组成。 根据类型,可以使用参数和脚本配置并扩展这些步骤,以提供所需的功能和控制。
每个步骤组件都有一个 步骤属性 用于定义和编辑所需属性的对话框。
以下属性的组合可用于大多数工作流步骤组件,位于 公共 属性对话框的选项卡:
标题
步骤的标题。
描述
步骤的描述。
工作流暂存
用于应用 暂存 跳到台阶。
超时
步骤将“超时”之前的时段。
您可以在以下选项之间进行选择: 关闭, 立即, 1h, 6h, 12h, 24h.
超时处理程序
用于在步骤超时时控制工作流的处理程序;例如:
Auto Advancer
处理程序前进
选择此选项可自动将工作流前进到执行后的下一个步骤。 如果未选中,则实施脚本必须处理工作流提升。
以下属性适用于许多工作流步骤组件,位于 用户/组 属性对话框的选项卡:
通过电子邮件通知用户
用户/组
此 AND拆分 在工作流中创建拆分,然后两个分支都将处于活动状态。 您可以根据需要向每个分支添加工作流步骤。 通过此步骤,可将多个处理路径引入工作流。 例如,您可以允许并行执行某些审阅步骤,从而节省时间。
要配置拆分,请执行以下操作:
编辑 AND拆分属性:
根据需要将工作流步骤添加到分支。
容器步骤会启动另一个作为子工作流执行的工作流模型。
利用此容器,可重用工作流模型以实施步骤的通用顺序。 例如,翻译工作流模型可用于多个编辑工作流。
要配置该步骤,请编辑并使用以下选项卡:
容器
此 跳转步骤 允许您指定要在工作流模型中执行的下一步。 您可以将规则定义、外部脚本或ECMA脚本指定为路由表达式,以评估工作流模型的下一步。
此 跳转步骤 允许您在工作流模型中实施高级工艺路线结构。 例如,要实施循环, 跳转步骤 可以定义为在工作流中执行前一个步骤,路由表达式用于评估循环条件。
要配置该步骤,请编辑并使用以下选项卡:
进程
Target步骤:选择评估路由表达式的条件后要执行的步骤。
路由表达式:选择规则定义、外部脚本或确定是否执行 Target步骤.
模拟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 变量为 count + 1 每次执行 设置变量 步骤。
在 跳转步骤,使用 设置变量 作为 Target步骤 和 计数< 5 作为路由表达式。
此 设置变量 步骤重复执行,增加 count 变量值1,直至该值达到5。
此 OR拆分 在工作流中创建拆分,之后只有一个分支处于活动状态。 通过此步骤,您可以将条件处理路径引入工作流。 您可以根据需要向每个分支添加工作流步骤。
有关创建OR分解的附加信息,请参阅: https://helpx.adobe.com/experience-manager/using/aem64_workflow_servlet.html
要配置拆分,请执行以下操作:
编辑 OR拆分属性:
通用
分支(x)
参见 定义OR拆分的规则.
根据需要将工作流步骤添加到分支。
A 参与者步骤 允许您为特定操作分配所有权。 只有在用户手动确认该步骤后,工作流才会继续。 当您希望某个人对工作流执行操作(例如,审核步骤)时,可使用此选项。
虽然不直接相关,但在分配操作时必须考虑用户授权;用户必须有权访问工作流有效负载所在的页面。
要配置该步骤,请编辑并使用以下选项卡:
在以下情况下,将始终通知工作流启动器:
需要配置某些属性以启用电子邮件通知。 您还可以自定义电子邮件模板或添加新语言的电子邮件模板。 参见 配置电子邮件通知 以在AEM中配置电子邮件通知。
使用 对话框参与者步骤 从分配了工作项的用户那里收集信息。 此步骤可用于收集稍后在工作流中使用的少量数据。
完成此步骤后, 完成工作项 对话框包含您在对话框中定义的字段。 在字段中收集的数据存储在工作流有效负荷的节点中。 然后,后续工作流步骤可以从存储库中读取值。
要配置该步骤,需指定要为其分配工作项的组或用户,以及对话框的路径。
要配置该步骤,请编辑并使用以下选项卡:
要创建对话框,您需要创建对话框:
您可以将小部件数据存储到工作流有效负载或工作项元数据中。 的格式 name
widget节点的属性确定数据存储的位置。
使用有效负载存储数据
要将小部件数据存储为工作流有效负载的属性,请为小部件节点的name属性的值使用以下格式:
./jcr:content/nodename
数据存储在中 nodename
有效负载节点的属性。 如果节点不包含该属性,则会创建该属性。
当与有效负载一起存储时,后续使用具有相同有效负载的对话框会覆盖属性的值。
使用工作项存储数据
要将小部件数据存储为工作项元数据的属性,请为name属性的值使用以下格式:
nodename
数据存储在中 nodename
工作项的属性 metadata
. 如果对话框随后与同一有效负载一起使用,则数据将保留。
对话框结构
对话框参与者步骤对话框类似于为创作组件创建的对话框。 它们存储在以下位置:
/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代码段表示一个对话框,该对话框存储 String
中的值 watchEmail
有效负荷内容的节点。 标题节点表示 文本字段 组件:
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
方法会返回动态解析的主体ID。 这可以是组ID或用户ID。
但是,组ID只能用于 参与者步骤,返回参与者列表时。 对于 动态参与者步骤 返回了空列表,该列表无法用于委派。
使您的实施可用于 动态参与者步骤 组件,将您的Java类添加到导出服务的OSGi捆绑包中,并将该捆绑包部署到AEM服务器。
随机参与者选择器 是一个选择随机用户的示例服务( com.day.cq.workflow.impl.process.RandomParticipantChooser
)。 此 随机参与者选择 r step组件示例扩展 动态参与者步骤 并将此服务用作实施步骤。
以下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以及分配了工作项的用户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
此 表单参与者步骤 在工作项打开时显示表单。 当用户填写并提交表单时,字段数据会存储在工作流有效负荷的节点中。
要配置该步骤,需指定要为其分配工作项的组或用户,以及表单的路径。
本节将介绍 用于页面创作的基础组件的Forms部分.
要配置该步骤,请编辑并使用以下选项卡:
创建用于的表单 表单参与者步骤 象平常一样。 但是,表单参与者步骤的表单必须具有以下配置:
此 表单的开头 组件必须具有 操作类型 属性设置为 Edit Workflow Controlled Resource(s)
.
此 表单的开头 组件必须具有值 Form Identifier
属性。
表单组件必须具有 元素名称 属性设置为存储字段数据的节点的路径。 路径必须在工作流有效负载内容中找到节点。 值使用以下格式:
./jcr:content/path_to_node
表单必须包含 工作流提交按钮 组件。 您未配置组件的任何属性。
工作流的要求决定了字段数据的存储位置。 例如,字段数据可用于配置页面内容的属性。 以下值 元素名称 属性将字段数据存储为 redirectTarget
的属性 jcr:content
节点:
./jcr:content/redirectTarget
在以下示例中,字段数据用作 文本 有效负载页面上的组件:
./jcr:content/par/text_3/text
第一个示例可用于 cq:Page
组件渲染。 第二个示例只能在有效负荷页面包含 文本 ID为的组件 text_3
.
表单可以位于存储库中的任意位置,但工作流用户必须获得读取表单的授权。
此 随机参与者选择器 步骤是一个参与者选择器,用于将生成的工作项分配给从列表中随机选择的用户。
要配置该步骤,请编辑并使用以下选项卡:
参数
此 工作流发起者参与者选择器 步骤是一个参与者选择器,用于将生成的工作项分配给启动工作流的用户。 除属性之外,没有要配置的属性 公共 属性。
要配置该步骤,请使用以下选项卡进行编辑:
A 流程步骤 执行ECMAScript或调用OSGi服务以执行自动处理。
要配置该步骤,请编辑并使用以下选项卡:
进程
进程:要执行的进程实施。 使用下拉菜单选择ECMAScript或OSGi服务。 有关信息:
处理程序前进:选择此选项可自动将工作流前进到执行后的下一个步骤。 如果未选中,则实施脚本必须处理工作流提升。
参数:要传递给进程的参数。
“设置变量”步骤允许您设置变量的值并定义值的设置顺序。 变量是按照变量映射在“设置变量”步骤中列出的顺序设置的。
要配置该步骤,请编辑并使用以下选项卡:
映射
选择变量: 使用此选项可选择变量以设置其值。
选择映射模式: 选择映射模式以设置变量的值。 根据变量的数据类型,您可以使用以下选项设置变量的值:
指定值: 指定要映射到变量的值。 在此字段中指定的值取决于映射模式。
添加映射: 使用此选项可添加更多映射以设置变量的值。