管理动态属性

可以在 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 数据类型支持配置 WhereJoin 子句。

计算值和选项

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(属性依赖于) 列表中的属性值改变时执行。

如果定义了该脚本,则属性输入字段会变成不可编辑状态。

重算只对 formLayout 表单布局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 后面,因此需要以逗号、joinleft 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