在下面的课程中,我们将讨论一个组件的不同元素。在这里,你会发现对工作流的一般结构的简短介绍。
一个组件是一种工作流程,可以由多个屏幕/步骤组成。任何可以用各种组件和用户界面步骤来建模的工作流程,也可以用一个组件来创建。通常情况下,人们倾向于创建 可重复使用的模块来完成特定的功能,例如,一个只让你选择日期的组件。这样一来,你甚至非开发人员都能够使用你的组件来模拟不同的business 流程。
组件是用XML编写的。你可以通过写下其规则来实现所需的行为,这些规则是ifA then B
语句。
例如,对于以下要求:如果用户正在检查一台机器并按下 "相机 "按钮,那么设备的内部相机就会启动。
同样的规则可以表达得更接近于实现:
如果我们在 "expect_machine "步骤
中,发生了一个带有 "Camera "命令
的事件
,那么执行 "start_camera "动作
。
一个组件的结构框架
一个组件的典型结构框架如下:
<workflow [ATTRIBUTES]>
<context> [...] </context> // Data variables, optional
<rules> [...] </rules> // If [Expression] then [actions]; optional
<actions> [...] </actions> // optional
<steps>
<step [ATTRIBUTES]>
<states>
<onresume> [...] </onresume> // optional
<onevent> [...] </onevent> // optional
[...]
</states>
<mapping> [...] </mapping>
</step>
[...]
</steps>
</workflow>
在继续举例说明之前,下面是对XML标签的概述:
<content> 定义了要处理的变量(数据)。
<规则> 由一个表达式和另一个动作组成。它定义了在什么条件下执行一组动作。
<行动>我们要在工作流程中使用的预定义行动(例如:启动设备摄像机,将一个上下文的值改为x,...)。
<步骤>设备上的屏幕:它包含屏幕的数据(上下文)和逻辑(规则和动作),并与用户界面模板相联系。
<states>决定何时检查一个规则(例如:当事件发生时,当进入或离开一个步骤时)。
<映射>将数据(上下文变量)映射到用户界面(定义在另一个文件中,我们将在后面看)。
组件的例子
为了更好地理解组件的结构,我们将使用一个非常基本的组件的例子。
用户在 "苹果 "和 "梨 "两个选项中进行选择。这个培训将使用相同的组件,并将在今后的工作中加以改进。
下面的截图是设备上可见的屏幕。
工作流程是:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<workflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" wfd_version="1.0" reporting="false"
id="choice" name="choice" descriptor="Choice component" startstep="choose"
xsi:noNamespaceSchemaLocation="../../../configuration/workflow.xsd">
<steps>
<step id="choose" descriptor="the user selects between two options" uitemplate="ChoiceScreen">
<states>
<onevent>
<rule id="menu_button_selection">
<expression>#{event:command} == 'APPLE' || #{event:command} == 'PEAR'</expression>
<actions>
<finish_workflow id="finish_workflow">
<output>
<param name="selected_button" type="string">#{event:command}</param>
</output>
</finish_workflow>
</actions>
</rule>
</onevent>
</states>
</step>
</steps>
</workflow>
下载组件
工作流程的解释
1.工作流标签包含一个属性startstep = "选择"。这是用来选择在初始化组件后首先执行的步骤。
2.<step id="choose"
...是用来指一个选择,这个选择将用uitemplate="ChoiceScreen "
进一步显示。
ChoiceScreen是一个文件,它定义了当我们在这个步骤中时,屏幕上显示的内容。
正如所解释的,一个组件的行为是用规则定义的。一个规则由一个表达式(或条件)和当该条件为 "真 "时应采取的行动组成。每个规则都被分配到<onenter>,
<onresume>,
<onleave>
,<onevent>
或<onpause>
中的一个状态。规则只有在组件处于该状态时才会被检查(例如,onenter,当组件第一次启动时)。
3. <规则id="menu_button_selection">
被分配给<onevent>
状态。每当一个事件发生时,所有给这个状态的规则都将被检查。这里,<expression>#{event:command} == 'APPLE' || #{event:command} == 'PEAR'</expression>
检查该事件是否包含一个特定的命令。当一个名为 "APPLE "或 "PEAR "的按钮被语音命令或在屏幕上按下时,这样的事件将被激活。
4.如果一个规则表达式评估为真,则执行该规则的<actions>
标签中的一组动作。在这个例子中,使用了finish_workflow
动作。一旦用户选择了两个选项中的一个,这个动作就会立即离开组件,并在<output>
参数中传递所做的选择,这样我们就可以根据该选择在工作流图中创建不同的转换过程。
任务
假设你想扩展我们的选择组件,将包含用户选择的信息发送回Frontline Connector(它可以反过来将这些信息传达给后端系统)。请思考以下问题:
- 你的组件会有哪些步骤?
- 看一看行动目录:你可能需要哪些行动?
帮助和资源
动作 是我们可以使用的基本构建模块。它们的范围从改变用户看到的东西(颜色、文本、通知......)到通过管理数据和与Frontline Connector或外部设备通信来控制程序的流程(过渡到下一个步骤)。
解决方案说明
首先,你可能会说,与Frontline Connector的通信是一个独立的功能,应该有自己的组件。你是完全正确的:将通信方面的功能分离到它自己的组件中,会使两个组件更容易被重用。另一方面,有时你想通过在一个组件中保留多个功能来为你的客户简化Frontline Creator界面中显示的过程流。现在,让我们假设我们把这两种功能结合在一个组件中。
你的组件可以有哪些步骤?
以前,你被告知,步骤基本上等同于屏幕。那么,如果额外的功能只是后端通信,你为什么要有一个以上的步骤?
答案是可维护性和可重用性。可维护性,因为当对通信方面进行修改时,你只需要看那一步,而不需要读任何其他的代码。可重用性,因为如果组件变得更加复杂,你也可以用同一个步骤发送不同的消息。
同样,将这两个功能做成两个独立的组件也是一个好主意。如果你把它们结合在一个组件中,至少要创建单独的步骤,这是一个好主意。只是让屏幕看起来一样,或者从连接器中添加一个进度通知确认。因此,我们建议在这里有两个步骤,例如 "选择 "和 "消息_连接器"。
你可能需要哪些行动?
这个问题的主要目的是让你熟悉 "行动 "目录。下面是你在实施过程中可能用到的行动的例子:
至此,你已经完成了第一课。下一课将是关于 范围,包括你的第一个实践任务。