# 表单数据生命期
# Overview
- 本文旨在解释表单数据生命期、及其权限控制和查错方式
- 表单数据以实例为单位,实例间没有耦合
# Introduction / 简介
# Categories / 数据分类
字段数据:主表单画的字段
内部变量:比如 _VAR_ACTION_ACCOUNT(当前办理用户的账号)。点此处查看完整列表
自定义变量:
- 通过Messenger或脚本定义直接返回到FormData中的变量
- 自定义变量的生命期从赋值之后一直有效
- 可用于表单名称、标签替换,以及样式公式
- 无法利用 DataBinding 的功能自动持久化
附加属性:Code等类型的字段或一些变量会带有附加属性,通过加后缀表示
- _Name后缀:作为Code时的显示值
- _Codes和_Names:作为Datasource使用,每个条目之间回车分割
- _Attr后缀:Code的额外属性
# Examination / 数据检查
除了直接肉眼查看渲染界面外,如下方式可辅助开发者调试
# [方式A] 前端渲染初始数据
在浏览器Console中,输入transformer.render.data查看加载数据
# [方式B] 前端渲染实时数据
在浏览器Console中,输入transformer.render.save()查看当前数据
# [方式C] 前后端传输数据
通过浏览器的网络通讯查看功能,在Request或Response中查看
# [方式D] 服务端传输数据
通过查看Messenger调用入口处的JSON,转化之后的数据不一定准确
# [方式E] 持久化数据
在IDE中,Project的Instances中,点击实例后的放大镜
# Presentation / 数据表示
# 传输数据
- 如无特别声明所有传输采用key-value方式表示
- 对于重复字段的数据,value是数组
- 重复字段的定义可递归
- 事件日期采用Unix时间戳
# 持久化数据
- 使用InfoPath的Xml格式保存
# Instance Stage / 实例阶段
- 发起
- 办理:待办中查看
- 回顾:在办和已办中查看表单
- 打印
- 完成或终止
- 撤回
- 一个实例可能会经历一次或多次上述阶段
- 数据生命期部分将会按上面单独分析
# Life Cycle / 数据生命期
# 发起
- 初试化数据
- 数据初始内容为InfoPath中的数据模版,默认无数据
CheckPoint 1
: 通过解压缩InfoPath文件查看template.xml文件
- 发起时数据
- 对于API发起的实例,可通过API参数以JSON给出,格式需符合上节的"数据表示"
- 对于发起页发起的实例,数据可由发起页获得
CheckPoint 2
: 对于存在发起页的,通过**[方式C]**查看
- 发起中数据
CheckPoint 3
: 通过**[方式D]**查看- INSTANCE_STARTING事件中,可获得上述数据,并可修改
CheckPoint 4
: 通过**[方式D]**查看- INSTANCE_STARTED事件中,可确认上述修改是否生效
- 持久化数据
- 数据直接转化成XML保存
CheckPoint 5
: 用户可在IDE中检查数据**[方式E]**
# 办理
# 渲染:数据从持久化到浏览器的过程
- 持久化读入
CheckPoint 1
: 用户可在IDE中检查数据**[方式E]**- 引擎总会读入最新的持久化数据,而不一定是上个步骤提交的数据
- 完善数据
- 重新计算内部变量
- 计算非重复字段表单初值
- 读入Code类型字段的附加属性
- 触发STEP_RENDERING
CheckPoint 2
: 用户可在Messenger端检查数据**[方式D]**- STEP_RENDERING可返回数据来影响界面呈现但不会持久化
- 修改的重复节字段请慎重,可能会带来FORM_DATA_UNAUTHORIZED异常
- 重复字段需有写权限,如不希望用户更改,请设置该group的控件属性readOnly=true
- 步骤字段权限处理
- 引擎会按照步骤字段权限,过滤掉用户不可读的数据传输给前台
- 当前视图页/ViewPage中如有画出的字段,会忽略该字段的步骤字段权限
CheckPoint 3
: 此时可在浏览器中检查**[方式A和方式C均可]**
# 交互:数据在浏览器中和用户交互的过程
- 渲染初始化过程
- 此过程不会公式等改变数据的事情
CheckPoint 1
: 如此时界面和上一个CheckPoint不符,请检查控件类型
- FIELD_CHANGING 事件
- FIELD_CHANGING通过触发Messenger改变表单数据
- 按钮点击、公式级联等也会触发 FIELD_CHANGING 事件
CheckPoint 2
: 触发前后的数据可通过**[方式C]**检查CheckPoint 3
: 可在Messenger端检查**[方式D]**
- FIELD_SUGGESTING 事件
- FIELD_SUGGESTING通过触发Messenger改变表单数据
CheckPoint 4
: 触发前后的数据可通过**[方式C]**检查,注意通讯的URL有所不同CheckPoint 5
: 对于外部代码表,可通过**[方式D]**
- 公式和CodeTable级联
- 公式和可由用户输入等其他任何可能的对数据的改变触发
- 默认情况下CodeTable数据或Datasource改变时,会级联清空其下级CodeTable的显示数据
CheckPoint 6
: 可通过**[方式B]**随时查看表单的当前数据
# 提交:数据在浏览器到持久化的过程
- 动作按钮点击
CheckPoint 1
: 可通过**[方式C]**查看网络通讯- 触发 ACTION_CLICKING 事件,可 临时 修改表单数据
- 该事件临时修改表单数据用于后续判断节点,但不会影响UI或持久化
CheckPoint 2
: 可通过**[方式D]**在Messenger端检查- 触发动作脚本、后续自动脚本执行,但同样是 临时 修改表单数据
- 确认提交(或保草稿)
CheckPoint 3
: 可通过**[方式C]**查看网络通讯- 注:存草稿和提交在表单数据方面工作流脚本之外,几乎具有相同的行为,所以在此一并讨论
- 步骤字段权限处理和完善
- 读入步骤字段权限,并做如下处理:
- 对于界面上不存在控件或节,移除其所有权限
- 对于初始化只读的数据(InitR+)的字段,移除写权限
- 按如下规则合并持久化数据和界面提交的数据:
- 检查界面提交过来的重复节信息,如和工作流编辑器配置的该步骤的增、删、排序权限冲突,报FORM_DATA_UNAUTHORIZED异常
- 有写权限的字段,以界面给的数据为准
- 无写权限的字段,以数据库为准,但会重新计算其排序
- 重新计算内部变量
- 读入Code类型字段的附加属性
- 对于InitR+的字段,计算字段表单初值
- 触发ACTION_DOING或ACTION_SAVING
CheckPoint 4
: 可在Messenger端检查数据**[方式D]**- ACTION_DOING或ACTION_SAVING的返回值可以改变表单数据
- 改变之后的数据会被重新计算Code类型的附加属性
- 重新计算实例名称、标签
- 执行动作脚本和自动节点脚本
- 存草稿动作不会触发本节事件
- 可以修改表单数据
- 这也是建立、使用"自定义变量"的一个时机
- 脚本对数据的改变无法直接检查到。但作为调试可以在任何执行路径的脚本中加入 error.report(${“fieldName”}) 来输出表单数据的某项内容,并阻止流程继续执行。
- 触发ACTION_DONE 或 ACTION_SAVED 或 INSTANCE_COMPLETED
CheckPoint 5
: 可在Messenger端检查数据**[方式D]**- 此时的数据即为最终持久化数据,Messenger无法更改
- 对于阻塞的Messenger依然可以返回错误来取消持久化
- 持久化
- 数据直接转化成XML保存
CheckPoint 6
: 用户可在IDE中检查数据**[方式E]**
# Review / 回顾
- 尚待完善
- 按照实例的回顾,会自动跳转到该实例、该用户办理过的最后一步回顾
- 一般情况下,回顾使用该实例的最新表单数据
- 现阶段仅有如下情况,使用用户在该步骤提交时的表单数据
- 处于动态并行节点内、且没有配置回顾模版
# View & Admin / 查看和管理
- 尚待完善
# Print / 打印
- 尚待完善
# Complete or Kill / 完成或终止
- 尚待完善
# Withdraw / 撤回
- 尚待完善
- 撤回时保持数据不变,尚未支持事件修改。
← InfoPlus APIs 变量 →