工作流模型由各种类型的一系列步骤组成。 根据类型,可以使用参数和脚本配置和扩展这些步骤,以提供所需的功能和控制。
每个步骤组件都有一个步骤属性对话框,通过该对话框可定义和编辑所需的属性。
在“属性”对话框的Common选项卡上,以下属性组合可用于大多数工作流步骤组件:
标题步骤的标题。
描述步骤的描述。
工作流暂存
一个下拉选择器,用于将Stage应用到该步骤。
超时
此步骤在其后将“超时”的时段。
您可以在以下两种方式中进行选择:Off、Immediate、1h、6h、12h、24h。
超时处理程序
在步骤超时时控制工作流的处理程序;例如:
Auto Advancer
处理程序前进
选择此选项可在执行后自动将工作流推进到下一步。 如果未选择,则实施脚本必须处理工作流进度。
属性对话框的用户/组选项卡上的以下属性可用于许多工作流步骤组件:
通过电子邮件通知用户
用户/组
AND Split在工作流中创建拆分,在该拆分之后,两个分支将处于活动状态。 您可以根据需要向每个分支添加工作流步骤。 此步骤允许您在工作流中引入多个处理路径。 例如,您可以允许并行执行某些审核步骤,从而节省时间。
要配置拆分,请执行以下操作:
编辑AND拆分属性:
根据需要将工作流步骤添加到分支。
容器步骤启动作为子工作流执行的另一个工作流模型。
此容器允许您重复使用工作流模型以实施常见的步骤序列。 例如,翻译工作流模型可用于多个编辑工作流。
要配置该步骤,请编辑并使用以下选项卡:
容器
通过转到步骤,可指定要在工作流模型中执行的下一步。 您可以指定规则定义、外部脚本或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循环。 创建 Long数据类型的countvariable。使用表达式作为设置变量步骤中的映射模式,在每次执行设置变量步骤时,将count变量的值设置为count + 1。
在转到步骤中,使用设置变量作为目标步骤,使用计数<5作为路由表达式。
在每次执行时, 设置变量步骤会重复执行,将count变量的值递增1,直到值达到5。
OR Split在工作流中创建拆分,在该拆分之后,只有一个分支处于活动状态。 通过此步骤,您可以在工作流中引入条件处理路径。 您可以根据需要向每个分支添加工作流步骤。
要配置拆分,请执行以下操作:
编辑OR拆分属性:
通用
分支(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 Path属性的值是对话框dialog
节点的路径。
例如,该对话框包含在节点中存储的名为EmailWatch
的组件中:
/apps/myapp/workflows/dialogs
对于触屏UI, Dialog Path属性使用以下值:
/apps/myapp/workflow/dialogs/EmailWatch/cq:dialog
示例对话框定义
以下XML代码段表示一个对话框,该对话框将String
值存储在有效负载内容的watchEmail
节点中。 标题节点表示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
脚本必须包含名为getParticiant的函数,该函数将用户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步骤组件示例扩展了动态参与者步骤,并将此服务用作步骤实施。
以下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部分。
要配置该步骤,请编辑并使用以下选项卡:
创建表单以正常与表单参与者步骤一起使用。 但是,表单参与者步骤的表单必须具有以下配置:
表单组件的开始必须将Action Type属性设置为Edit Workflow Controlled Resource(s)
。
表单组件的开始必须具有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服务。 有关信息:
处理程序高级:选择此选项可在执行后自动将工作流推进到下一步。如果未选择,则实施脚本必须处理工作流进度。
参数:要传递到进程的参数。
通过设置变量步骤,您可以设置变量的值并定义值的设置顺序。 变量按变量映射在设置变量步骤中列出的顺序进行设置。
要配置该步骤,请编辑并使用以下选项卡:
映射
选择变量: 使用此选项可选择一个变量以设置其值。
选择映射模式: 选择映射模式以设置变量的值。根据变量的数据类型,您可以使用以下选项设置变量的值:
指定值: 指定要映射到变量的值。在此字段中指定的值取决于映射模式。
添加映射: 使用此选项可添加更多映射以设置变量的值。