管理动态属性

可以在 Administration(管理) > Dynamic attributes(动态属性) 界面管理动态属性。界面的左边有分类列表,右边展示选中分类包含的属性。

dyn attr

在修改了动态属性配置之后,点击 Apply changes(应用更改) 按钮。

Dynamic attributes 界面也包含将选中的分类导出成 ZIP 或 JSON 格式的导出操作以及导入操作。

创建分类

在给实体创建动态属性前,首先需要创建一个属性分类。设置分类名称并选择该分类所关联的实体。

create category

如果实体类实现了 Categorized 接口,Is default(是否默认) 复选框表示会自动为新实例选择这个分类。

如果实体未实现 Categorized 接口,则 Is default(是否默认) 复选框不起作用,你可以自己为该实体创建单一分类,或者创建多个分类,所有分类中的属性都会按照 可见性 进行展示。

如果应用程序支持多种语言,则会显示 Localization(本地化) 标签页。支持为分类设置每个可用语言环境的本地化名称。

localization category

在 Attributes location(属性位置) 标签页,可以设置每个动态属性在 DynamicAttributesPanel 内的位置。

attribute location

在 Columns count(列计数) 下拉列表中指定列的数量。如需更改属性的位置,从属性列表拖拽该属性放置到目的行列的位置。也可以添加空的单元格或者更改属性的顺序。做完修改后,点击 Save configuration(保存配置) 按钮。

创建属性

常规设置

在 Category attribute editor(分类属性编辑) 的 General(常规) 标签页中,可以设置名称、系统编码、描述、值类型、默认值以及验证脚本。

create attribute

对于除 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(枚举类型) 字段中定义命名值集合。每个枚举值可以进行本地化显示设置。

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 类的重算脚本示例:

calculated

使用 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 类型属性的脚本示例:

    options
  • 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 变量访问,示例:

    jpql and where fields

本地化

如果应用程序支持多种语言,则会显示 Localization(本地化) 标签页。所有类型的动态属性都支持本地化。

localization attr

可见性

设置可见性可以控制动态属性在哪些界面展示。默认情况下,动态属性不显示。

visibility

如需在 Visibility(可见性) 标签页选择某个界面,则需要在界面中添加 dynamicAttributes facet。

除了界面之外,还可以指定允许展示动态属性的界面组件。例如,在界面中的多个 Form 组件展示同一实体的多个字段。

如果属性在某个界面可见,则界面中展示对应实体的所有表单和表格中都会展示这个属性。

如果实体实现了 Categorized,可以使用 DynamicAttributesPanel。

对动态属性的访问权限也可以通过 资源角色 进行限制。动态属性相关的安全设置与普通属性类似。

resource role