管理动态属性
可以在 Administration(管理) > Dynamic attributes(动态属性) 界面管理动态属性。界面的左边有分类列表,右边展示选中分类包含的属性。
在修改了动态属性配置之后,点击 Apply changes(应用更改) 按钮。
Dynamic attributes 界面也包含将选中的分类导出成 ZIP 或 JSON 格式的导出操作以及导入操作。
创建分类
在给实体创建动态属性前,首先需要创建一个属性分类。设置分类名称并选择该分类所关联的实体。
如果实体类实现了 Categorized
接口,Is default(是否默认) 复选框表示会自动为新实例选择这个分类。
如果实体未实现 Categorized
接口,则 Is default(是否默认) 复选框不起作用,你可以自己为该实体创建单一分类,或者创建多个分类,所有分类中的属性都会按照 可见性 进行展示。
如果应用程序支持多种语言,则会显示 Localization(本地化) 标签页。支持为分类设置每个可用语言环境的本地化名称。
在 Attributes location(属性位置) 标签页,可以设置每个动态属性在 DynamicAttributesPanel 内的位置。
在 Columns count(列计数) 下拉列表中指定列的数量。如需更改属性的位置,从属性列表拖拽该属性放置到目的行列的位置。也可以添加空的单元格或者更改属性的顺序。做完修改后,点击 Save configuration(保存配置) 按钮。
创建属性
常规设置
在 Category attribute editor(分类属性编辑) 的 General(常规) 标签页中,可以设置名称、系统编码、描述、值类型、默认值以及验证脚本。
对于除 Boolean
以外的所有值类型,都可以设置 Form
中的字段宽度(以像素为单位或百分比)。如果 Width(宽度) 字段为空,则假定其值为 100%。
对于除 Boolean
之外的所有值类型,还有一个 Is collection(是否集合) 复选框。支持为所选的值类型创建多值动态属性。
对于 Double(双精度浮点数)
、Fixed-point number(定点数)
、Integer(整数)
类型,可以用下列字段:
-
Minimum value - 当输入属性值时,会检查属性值必须大于等于指定的最小值。
-
Maximum value - 当输入属性值时,会检查属性值必须小于等于指定的最大值。
对于 Fixed-point number(定点数)
值类型,可以使用 Number format pattern(数字显示格式) 字段设置数字格式。数字格式按照 DecimalFormat 介绍的规则设置。
对于所有的值类型,可以在 Validation script(验证脚本) 字段设置 Groovy 脚本用于验证输入的值。如果验证失败,脚本应当返回一个错误消息。否则,脚本可以不返回任何值或者返回 null
。被检查的值在脚本中可以使用 value
变量获取。错误消息是一个 Groovy 字符串,其中可以用 $value
关键字。
示例:
if (!value.startsWith("correctValue")) return "the value '\${value}' is incorrect"
对于 Enumeration(枚举)
值类型,通过列表编辑器在 Enumeration(枚举类型) 字段中定义命名值集合。每个枚举值可以进行本地化显示设置。
对于 String(字符串)
、Double(双精度浮点数)
、Entity(实体)
、Fixed-point number(定点数)
和 Integer(整数)
数据类型,可以使用 Lookup field((下拉框控件))。如果勾选了此设置,用户可以从下拉列表中选择属性值。选项值列表在 Calculated values and options(计算值和选项) 标签页配置。Entity
数据类型支持配置 Where 和 Join 子句。
计算值和选项
在 Calculated values and options(计算值和选项) 标签页,可以指定当前属性依赖的其他属性。当改变其中一个依赖属性时,则会重新执行计算该属性值的脚本或计算 选项值列表 的脚本。
Groovy 脚本必须返回一个新的参数值。脚本将接收到下列变量:
-
entity
- 当前编辑的实体; -
dynamicAttributes
- 一个 map 映射,key
- 属性编码,value
- 动态属性的值。
使用 EntityValues
类的重算脚本示例:
使用 dynamicAttributes
map 重算脚本示例:
if (dynamicAttributes['PassengerNumberofseats'] > 9) return 'Bus' else return 'Passenger'
脚本会在 Attributes depends on(属性依赖于) 列表中的属性值改变时执行。
如果定义了该脚本,则属性输入字段会变成不可编辑状态。
重算只对 Form 和 DynamicAttributesPanel UI 组件有效。
如果选中 General(常规) 标签页的 Lookup field((下拉框控件)),可以在 Options type(选项类型) 中选择选项加载器的类型。
可用的选项加载器类型:Groovy、SQL、JPQL(仅支持 Entity
数据类型)。
-
Groovy 选项加载器会使用 Groovy 脚本加载值的列表。
entity
变量会传递给脚本,因此可以在脚本中使用实体的属性(包括动态属性)。包含String
类型属性的脚本示例: -
SQL 选项加载器使用 SQL 脚本加载选项值列表。可以在脚本中使用
${entity}
变量访问实体 id。使用${entity.<field>}
访问实体参数,field
是实体参数的名称。+
前缀可以用来访问实体的动态属性,比如${entity.+<field>}
。脚本示例(这里我们访问实体和实体的动态属性PassengerTypeofcar
):select LAST_NAME from SAMPLE_DRIVER where CAR_TYPE = ${entity.+PassengerTypeofcar}
-
JPQL 选项加载器只支持
Entity
类型的动态属性。JPQL 条件通过 Join clause(Join 子句) 和 Where clause(Where 子句) 字段设置。在 JPQL 参数中可以使用{entity}
和{entity.<field>}
变量。Join clause(Join 子句) 的值会添加至
from
后面,因此需要以逗号、join
或left join
开头。在脚本中可以使用动态属性,通过
entity
变量访问:${entity.+<dynamicAttrCode>}
,这里<dynamicAttrCode>
表示对应动态属性的编码。{E}
占位符可以作为实体的别名。在执行查询语句的时候,会用指定的别名进行替换。示例:
join {E}.seller s
Where clause(Where 子句) 字段的值会使用
and
条件添加在where
子句的后面。因此,不需要手动添加where
。在脚本中可以使用动态属性,通过
entity
变量访问,示例:
可见性
设置可见性可以控制动态属性在哪些界面展示。默认情况下,动态属性不显示。
如需在 Visibility(可见性) 标签页选择某个界面,则需要在界面中添加 dynamicAttributes facet。
除了界面之外,还可以指定允许展示动态属性的界面组件。例如,在界面中的多个 Form
组件展示同一实体的多个字段。
如果属性在某个界面可见,则界面中展示对应实体的所有表单和表格中都会展示这个属性。
如果实体实现了 Categorized
,可以使用 DynamicAttributesPanel。
对动态属性的访问权限也可以通过 资源角色 进行限制。动态属性相关的安全设置与普通属性类似。