工作流中的 JavaScript 代码示例 javascript-in-workflows
以下示例说明如何在工作流中使用JavaScript代码:
在这些示例中,使用ECMAScript for XML (E4X)扩展。 使用此扩展,您可以在同一个脚本中组合JavaScript调用和XML基元。
要尝试这些示例,请执行以下步骤:
-
创建工作流并将以下活动添加到工作流中:
- 开始活动
- JavaScript代码活动
- 结束活动
-
将JavaScript代码添加到活动中。 了解详情。
-
保存工作流。
-
测试示例:
示例1:写入数据库 write-example
要写入数据库,可以在xtk:session
架构上使用静态Write
方法:
-
以XML撰写写入请求。
-
写入记录:
-
在
xtk:session
架构中调用Write
方法。note important IMPORTANT 如果您使用Adobe Campaign v8,我们建议您在Snowflake表中对 Write
方法的 摄取 和 数据更新/删除 API使用暂存机制。 了解更多信息。 -
将XML代码作为写入请求的参数传递。
-
步骤1:编写写入请求
您可以添加、更新和删除记录。
插入记录
由于insert
操作是默认操作,因此无需指定。
将此信息指定为XML属性:
- 要修改的表的模式
- 要填充的表字段
例如:
var myXML = <recipient xtkschema="nms:recipient"
firstName="Isabel"
lastName="Garcia"
email="isabel.garcia@mycompany.com"/>
更新记录
使用_update
操作。 了解详情。
将此信息指定为XML属性:
- 要修改的表的模式
- 要更新的表字段
- 标识要更新的记录所需的关键参数
例如:
var myXML = <recipient xtkschema="nms:recipient"
status="Client"
email="isabel.garcia@mycompany.com"
operation="_update"
_key="@email"/>
删除记录
使用DeleteCollection
方法。 了解详情。
指定以下信息:
- 要修改的表的模式
- 以XML元素的形式标识要更新的记录所需的
where
子句
例如:
xtk.session.DeleteCollection(
"nms:recipient",
<where>
<condition expr="[@email] = 'isabel.garcia@mycompany.com'"/>
</where>,
false
)
第2步:写入记录
在xtk:session
架构上调用非静态Write
方法:
xtk.session.Write(myXML)
此方法未返回任何值。
将完整代码添加到工作流中的JavaScript代码活动:
var myXML = <recipient xtkschema="nms:recipient"
firstName="Isabel"
lastName="Garcia"
email="isabel.garcia@mycompany.com"/>
xtk.session.Write(myXML)
本视频说明如何写入数据库:
示例2:查询数据库 read-example
要查询数据库,可以使用非静态xtk:queryDef
实例方法:
- 以XML格式编写查询。
- 创建查询对象。
- 运行查询。
步骤1:撰写查询
指定queryDef
实体的XML代码。
语法:
<queryDef schema="nms:recipient" operation="">
<!-- select, where, and orderBy clauses as XML elements -->
</queryDef>
指定以下信息:
- 要读取的表的模式
- 操作
- 在
select
子句中要返回的列 where
子句中的条件orderBy
子句中的筛选条件
您可以使用以下操作:
select
getIfExists
get
count
count
属性的元素形式返回了匹配记录数。将select
、where
和orderBy
子句编写为XML元素:
-
select
子句指定要返回的列。 例如,要选择人员的名字和姓氏,请编写以下代码:
code language-xml <select> <node expr="@firstName"/> <node expr="@lastName"/> </select>
使用
nms:recipient
架构时,元素将以下列形式返回:code language-xml <recipient firstName="Bo" lastName="Didley"/>
-
where
子句要指定条件,请使用
where
子句。 例如,要选择位于 Training 文件夹中的记录,您可以编写以下代码:code language-xml <where> <condition expr="[folder/@label]='Training'"/> </where>
组合多个表达式时,在第一个表达式中使用布尔运算符。 例如,要选择名为Isabel Garcia的所有人员,您可以编写以下代码:
code language-xml <condition boolOperator="AND" expr="@firstName='Isabel'"/> <condition expr="@lastName='Garcia'"/>
-
orderBy
子句要对结果集进行排序,请将
orderBy
子句指定为具有sortDesc
特性的XML元素。 例如,要按升序对姓氏进行排序,您可以编写以下代码:code language-xml <orderBy> <node expr="@lastName> sortDesc="false"/> </orderBy>
步骤2:创建查询对象
要从XML代码创建实体,请使用create(
content
)
方法:
var query = xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
…
</queryDef>)
为create(
content
)
方法添加要创建的实体的架构前缀。
content
参数是字符串参数,是可选的。 此参数包含描述实体的XML代码。
步骤3:运行查询
执行以下步骤:
-
在
queryDef
实体上调用ExecuteQuery
方法:code language-javascript var res = query.ExecuteQuery()
-
处理结果:
- 使用循环构造对
select
操作的结果进行迭代。 - 使用
getIfExists
操作测试结果。 - 使用
count
操作对结果进行计数。
- 使用循环构造对
select
操作的结果
所有匹配项都将作为集合返回:
<recipient-collection>
<recipient email="jane.smith@mycompany.com">
<recipient email="john.harris@mycompany.com">
</recipient-collection>
要循环遍历结果,请使用for each
循环:
for each (var rcp in res:recipient)
logInfo(rcp.@email)
循环包括一个本地收件人变量。 对于收件人集合中返回的每个收件人,都会打印出收件人的电子邮件。 了解有关logInfo
函数的更多信息。
getIfExists
操作的结果
每个匹配都作为元素返回:
<recipient id="52,378,079">
如果没有匹配项,则返回空元素:
<recipient/>
您可以引用主键节点,例如@id
属性:
if (res.@id !=undefined)
{ // match was found
…
}
get
操作的结果
一个匹配项作为元素返回:
<recipient id="52,378,079">
如果没有匹配项,则会返回错误。
get
操作。 否则,请使用getIfExists
操作。 如果使用此最佳实践,则错误会显示意外问题。 如果您使用get
操作,请不要使用try…catch
语句。 该问题由工作流的错误处理过程处理。count
操作的结果
返回具有count
属性的元素:
<recipient count="200">
要使用结果,请参阅@count
属性:
if (res.@count > 0)
{ // matches were found
…
}
对于select
操作,请将此代码添加到工作流中的JavaScript代码活动:
var myXML =
<queryDef schema="nms:recipient" operation="select">
<select>
<node expr="@firstName"/>
<node expr="@lastName"/>
</select>
</queryDef>
var query = xtk.queryDef.create(myXML)
var res = query.ExecuteQuery()
for each (var rcp in res.recipient)
logInfo(rcp.@firstName + " " + rcp.@lastName)
由于select
操作是默认操作,因此无需指定。
本视频说明如何从数据库读取:
触发工作流 trigger-example
例如,您可以在技术工作流中以编程方式触发工作流,或处理用户在Web应用程序页面上输入的信息。
工作流触发通过使用事件起作用。 您可以将这些功能用于事件:
您可以通过不同方式触发工作流:
-
您可以内联触发工作流,即从 JavaScript code 活动的主脚本中触发。
-
另一个工作流完成后,您可以触发该工作流:
-
向初始工作流的 End 活动添加初始化脚本。
-
在目标工作流的开头添加 External signal 活动。
完成初始工作流后,将发布事件。 将激活传出过渡并填充事件变量。 然后,目标工作流接收该事件。
note tip TIP 作为最佳实践,在向活动添加脚本时,请用双连字符将活动名称括起来,例如 -- end --
。 了解更多工作流最佳实践。
-
PostEvent
方法的语法:
PostEvent(
String //ID of the target workflow
String //Name of the target activity
String //Name of the transition to be activated in case of multiple transitions
XML //Event parameters, in the <variables/> element
Boolean //To trigger the target workflow only once, set this parameter to true.
)
在此示例中,工作流完成后,会向 wkfExampleReceiver 工作流的 信号 活动传递一个简短文本:
var strLabel = "Adobe Campaign, Marketing that delivers"
xtk.workflow.PostEvent(
"wkfExampleReceiver",
"signal",
"",
<variables strLine={strLabel}/>,
false)
由于最后一个参数设置为false
,每次完成初始工作流时,都会触发 wkfExampleReceiver 工作流。
在触发工作流时,请牢记以下原则:
PostEvent
命令异步运行。 命令位于服务器队列中。 方法会在事件发布后返回。- 必须启动目标工作流。 否则,错误将写入日志文件。
- 如果目标工作流已暂停,则
PostEvent
命令将排入队列,直到工作流恢复为止。 - 触发的活动不要求任务正在执行。
本视频说明如何使用静态API方法:
本视频说明如何触发工作流:
与数据库交互 interact-example
以下示例显示如何执行这些操作:
- 在架构上使用
get
和create
方法以使用非静态SOAP方法 - 创建执行SQL查询的方法
- 使用
write
方法插入、更新和删除记录
执行以下步骤:
带有select
子句的queryDef
方法的语法
<queryDef schema="schema_key" operation="operation_type">
<select>
<node expr="expression1">
<node sql="expression2">
</select>
<where>
<condition expr="expression1"/>
<condition sql="expression2"/>
</where>
<orderBy>
<node expr="expression1">
<node sql="expression2">
</orderBy>
<groupBy>
<node expr="expression1">
<node sql="expression2">
</groupBy>
<having>
<condition expr="expression1"/>
<condition sql="expression2"/>
</having>
</queryDef>
Create
方法
示例1:选择记录并写入日记帐
已选择位于 wfExamples 文件夹中的工作流的内部名称。 结果按内部名称升序排序,并写入日志。
var query = xtk.queryDef.create(
<queryDef schema="xtk:workflow" operation="select">
<select>
<node expr="@internalName"/>
</select>
<where>
<condition expr="[folder/@name]='wfExamples'"/>
</where>
<orderBy>
<node expr="@internalName" sortDesc="false"/>
</orderBy>
</queryDef>
)
var res = query.ExecuteQuery()
for each (var w in res.workflow)
logInfo(w.@internalName)
示例2:删除记录
将选择名为Chris Smith的所有收件人的名字、姓氏、电子邮件和ID。 结果按电子邮件升序排序,并写入日志。 使用delete
操作删除所选记录。
// Build the query, create a query object and hold the object in a variable
var query = xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
<select>
<node expr="@firstName"/>
<node expr="@lastName"/>
<node expr="@email"/>
<node expr="@id"/>
</select>
<where>
<condition expr="[folder/@label]='Recipients'"/>
<condition expr="[@lastName]='Smith'"/>
<condition expr="[@firstName]='Chris'"/>
</where>
<orderBy>
<node expr="@email" sortDesc="false"/>
</orderBy>
</queryDef>
)
//Run the query using the ExecuteQuery method against the created object
var res = query.ExecuteQuery()
//Loop through the results, print out the person's name and email, then delete the records
for each (var rec in res.recipient)
{
logInfo("Delete record = Email: " + rec.@email + ', ' + rec.@firstName + ' ' + rec.@lastName)
xtk.session.Write(<recipient xtkschema="nms:recipient" _operation="delete" id={rec.@id}/>)
}
示例3:选择记录并写入日记帐
在此示例中,使用非静态方法。 已选择其信息存储在 1234 文件夹中且其电子邮件域名以“adobe”开头的所有收件人的电子邮件和出生年份。 结果按出生日期降序排序。 收件人的电子邮件将写入日志。
var query = xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
<select>
<node expr="@email"/>
<node sql="sEmail"/>
<node expr="Year(@birthDate)"/>
</select>
<where>
<condition expr="[@folder-id] = 1234 and @domain like 'adobe%'"/>
<condition sql="iFolderId = 1234 and sDomain like 'adobe%'"/>
</where>
<orderBy>
<node expr="@birthDate" sortDesc="true"/>
</orderBy>
</queryDef>
)
var res = query.ExecuteQuery()
for each (var w in res.recipient)
logInfo(w.@email)
Write
方法
您可以插入、更新和删除记录。 您可以在Adobe Campaign中的任何架构上使用Write
方法。 由于此方法为静态方法,因此您无需创建对象。 您可以使用以下操作:
-
update
操作 -
insertOrUpdate
操作,带有_key
参数以标识要更新的记录如果未指定 收件人 文件夹,则如果存在匹配项,则会在任何子文件夹中更新记录。 否则,将在根 收件人 文件夹中创建记录。
-
delete
操作
Write
方法的 摄取 和 数据更新/删除 API使用暂存机制。 了解更多信息。示例1:插入或更新记录
xtk.session.Write(
<recipient
xtkschema="nms:recipient"
_operation="insertOrUpdate" _key="@email"
lastName="Lennon"
firstName="John"
email="johnlennon@thebeatles.com"
/>
)
示例2:删除记录
此示例将静态方法与非静态方法结合使用。
var query=xtk.queryDef.create(
<queryDef schema="nms:recipient" operation="select">
<select>
<node expr="@Id"/>
</select>
<where>
<condition expr="[@email]='johnlennon@thebeatles.com'"/>
</where>
</queryDef>
);
var res = query.ExecuteQuery()
for each (var w in res.recipient) {
xtk.session.Write(
<recipient xtkschema="nms:recipient" _operation="delete" id={w.@id}/>
);
}
本视频说明如何使用非静态API方法:
本视频演示了在工作流中使用非静态API方法的示例: