# 表单字段显示优化
在前面的步骤中,我们只创建了表单,没有给表单添加字段。这种情况下,系统显示模型的全部字段,标题是字段名(例如 contactInfo),控件按字段类型选择默认控件,例如字符类型使用单行输入框,数字类型使用数字输入框。
本章为表单添加表单字段(DynamicFormField),设置中文显示名称,并对以下字段定制显示控件:
| 模型 | 字段 | 表单 | 显示控件(displayType) |
|---|---|---|---|
| Customers | contactInfo | 新建、编辑 | 长文本(text) |
| SalesOpportunities | expectedAmount | 列表、新建、编辑 | 货币(currency) |
注意
一个表单只要定义了任意一个表单字段,就只显示已定义的字段,未定义的字段不再显示。所以为某个表单添加字段时,要把需要显示的字段都加上。
# 在界面上添加表单字段
打开「开发配置 > 表单 > 表单字段」,点击「创建」,为新建客户表单添加联系方式字段:
| 字段 | 值 |
|---|---|
| 所属表单 | Create Customers |
| 字段类型 | Static field(模型中的字段;表单临时参数使用 Transient field) |
| 字段名称 | contactInfo |
| 显示名称 | 联系方式 |
| 帮助信息 | 手机号、座机或邮箱,可填写多个 |
| 字段显示类型 | text |
| 是否可为空 | 关闭 |
| 显示顺序 | 20 |
「字段显示类型」对应 displayType,留空时按字段类型使用默认控件。窗口中的「扩展信息」编辑框实际高度约为浏览器可视区域高度的 70%,上图为了便于阅读把它调矮了。「Decides」(联动刷新的字段)未翻译是当前版本的界面问题,本教程不需要填写。
# 用 CSV 批量添加表单字段
三个客户表单、三个销售机会表单一共有几十个字段,逐个在界面上添加比较繁琐,可以用 CSV 一次导入。在 codes/data/csv 下新建 DynamicFormField_crm.csv:
form.name(*),fieldName(*),displaySequence,label,helpText,fieldType,nullable,displayType
;; CRM 教程:客户表单字段
List of Customers,name,10,客户姓名,,STATIC_FIELD,N,
List of Customers,contactInfo,20,联系方式,,STATIC_FIELD,N,
List of Customers,companyName,30,公司名称,,STATIC_FIELD,Y,
List of Customers,position,40,职位,,STATIC_FIELD,Y,
List of Customers,group,50,客户分组,,STATIC_FIELD,Y,
List of Customers,birthday,60,生日,,STATIC_FIELD,Y,
Create Customers,name,10,客户姓名,,STATIC_FIELD,N,
Create Customers,contactInfo,20,联系方式,手机号、座机或邮箱,可填写多个,STATIC_FIELD,N,text
Create Customers,companyName,30,公司名称,,STATIC_FIELD,Y,
Create Customers,position,40,职位,,STATIC_FIELD,Y,
Create Customers,group,50,客户分组,,STATIC_FIELD,Y,
Create Customers,birthday,60,生日,,STATIC_FIELD,Y,
Update Customers,name,10,客户姓名,,STATIC_FIELD,N,
Update Customers,contactInfo,20,联系方式,手机号、座机或邮箱,可填写多个,STATIC_FIELD,N,text
Update Customers,companyName,30,公司名称,,STATIC_FIELD,Y,
Update Customers,position,40,职位,,STATIC_FIELD,Y,
Update Customers,group,50,客户分组,,STATIC_FIELD,Y,
Update Customers,birthday,60,生日,,STATIC_FIELD,Y,
;; CRM 教程:销售机会表单字段
List of SalesOpportunities,name,10,机会名称,,STATIC_FIELD,N,
List of SalesOpportunities,customer,20,客户,,STATIC_FIELD,N,
List of SalesOpportunities,stage,30,机会阶段,,STATIC_FIELD,N,
List of SalesOpportunities,expectedAmount,40,预期金额,,STATIC_FIELD,N,currency
List of SalesOpportunities,expectedCloseDate,50,预计关闭日期,,STATIC_FIELD,N,
List of SalesOpportunities,interactionRecords,60,互动记录,,STATIC_FIELD,Y,
List of SalesOpportunities,tasks,70,任务,,STATIC_FIELD,Y,
Create SalesOpportunities,name,10,机会名称,,STATIC_FIELD,N,
Create SalesOpportunities,customer,20,客户,,STATIC_FIELD,N,
Create SalesOpportunities,stage,30,机会阶段,,STATIC_FIELD,N,
Create SalesOpportunities,expectedAmount,40,预期金额,,STATIC_FIELD,N,currency
Create SalesOpportunities,expectedCloseDate,50,预计关闭日期,,STATIC_FIELD,N,
Create SalesOpportunities,interactionRecords,60,互动记录,,STATIC_FIELD,Y,
Create SalesOpportunities,tasks,70,任务,,STATIC_FIELD,Y,
Update SalesOpportunities,name,10,机会名称,,STATIC_FIELD,N,
Update SalesOpportunities,customer,20,客户,,STATIC_FIELD,N,
Update SalesOpportunities,stage,30,机会阶段,,STATIC_FIELD,N,
Update SalesOpportunities,expectedAmount,40,预期金额,,STATIC_FIELD,N,currency
Update SalesOpportunities,expectedCloseDate,50,预计关闭日期,,STATIC_FIELD,N,
Update SalesOpportunities,interactionRecords,60,互动记录,,STATIC_FIELD,Y,
Update SalesOpportunities,tasks,70,任务,,STATIC_FIELD,Y,
;; CRM 教程:子表(互动记录、任务)使用各自的 LIST 表单显示列
List of InteractionRecords,name,10,主题,,STATIC_FIELD,N,
List of InteractionRecords,interactionType,20,互动类型,,STATIC_FIELD,N,
List of InteractionRecords,interactionDate,30,互动日期,,STATIC_FIELD,N,
List of InteractionRecords,notes,40,备注,,STATIC_FIELD,Y,
List of Tasks,name,10,任务名称,,STATIC_FIELD,N,
List of Tasks,description,20,任务描述,,STATIC_FIELD,N,
List of Tasks,dueDate,30,截止日期,,STATIC_FIELD,N,
List of Tasks,status,40,状态,,STATIC_FIELD,N,
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
- 表单字段按
form.name(*)和fieldName(*)两列查找。上一节在界面上创建的「Create Customers / contactInfo」会被这一行更新,不会重复创建。 fieldType为STATIC_FIELD表示模型中的字段。- 销售机会表单中的子表列标题取自子对象的 LIST 表单,所以最后为
List of InteractionRecords和List of Tasks也设置了中文名称。
保存后重启后端服务。
# 效果
编辑客户时,联系方式变成了多行文本框,所有字段都显示中文名称:
销售机会列表中,预期金额按货币格式显示:
编辑销售机会时,子表的列标题也变成了中文:
注意
1.0.0-beta18 中 currency 控件固定使用美元符号 $ 作为前缀,编辑状态下输入框较窄,金额较大时显示不全(例如上图中 1,280,000 只显示出 $ 1,280)。如果需要人民币显示,可以暂时使用默认的数字控件(displayType 留空)。
系统默认支持的 displayType 列表请参考下述列表:
| key | 控件 |
|---|---|
id | 标识符 |
string | 单行文本 |
text | 多行文本 |
password | 密码 |
integer、int、long | 整数 |
decimal | 小数 |
percentage | 百分比 |
currency | 货币 |
date | 日期 |
dateRange | 日期范围 |
datetime | 日期时间 |
zonedDatetime | 带时区的日期时间 |
boolean | 开关 |
enum | 枚举下拉 |
httpMethod | HTTP 方法(枚举下拉) |
valueSelect | 值选择 |
link | 链接,可用 extInfo 的 link 设置显示文字和打开方式 |
progress | 进度条 |
icon | 图标 |
treeSelect | 树选择 |
roles | 角色 |
code | 代码编辑器 |
json | JSON 编辑器 |
markdown | Markdown 编辑器 |
stacktrace | 堆栈信息 |
functionEditor | 函数编辑器 |
file | 单个文件 |
fileList | 多个文件 |
image | 图片 |
video | 视频 |
object | 单个对象选择 |
objects | 多个对象选择 |
genericObject、genericObjects | 任意类型对象的只读显示 |
array | 一对多关联对象列表 |
subTable | 子表,见 高级字段控件 |
relativeSubTable | 按关联路径显示的子表,见 高级字段控件 |
authentication | 用户信息(如创建人)的只读显示 |
popOverSteps | 步骤状态 |
lineChart | 折线图 |
tableChart | 表格图 |
至此,一个包含客户、销售机会、互动记录和任务的简易 CRM 就搭建完成了。
如果要把这套 CRM 做成插件、在其他环境中一次性装好,还需要把在界面上创建的表单、菜单和动作绑定也写成 CSV(DynamicForm.csv 中补上 label、objectType.shortName(*)、type.name(*) 等列,以及 DynamicMenu.csv、DynamicActionDynamicForm.csv)。本教程中的 DynamicForm_crm.csv 只更新已有表单的访问权限,在没有这些表单的新环境中会导入失败。各文件的列说明见 CSV 导入模板。