我们引入了一个新的 type: objects 到主题设置支持类型中,可用于替换现有的 json_schema 类型,我们计划不久后将其弃用。
定义 objects 类型的主题设置
要创建 objects 类型的主题设置,首先像任何主题设置一样定义一个顶级键,它将用作设置的名称。
links: ...
接下来,向设置中添加 type、default 和 schema 关键字。
links:
type: objects
default: []
schema: ...
type: objects 表示这是一个 objects 类型的设置,而 default: [] 注解将设置的默认值设为空数组。请注意,默认值也可以设置为对象数组,我们将在定义 schema 后演示这一点。
要定义 schema,首先像这样定义 schema 的 name:
links:
type: objects
default: []
schema:
name: link
接下来,我们将向 schema 添加 properties 关键字,这将允许我们定义和验证每个对象的结构。
links:
type: objects
default: []
schema:
name: link
properties:
name: ...
在上面的示例中,我们声明 link 对象有一个 name 属性。为了定义预期的数据类型,每个属性都需要定义 type 关键字。
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
上述 schema 定义声明 link 对象有一个类型为 string 的 name 属性,这意味着该属性仅接受字符串值。目前支持以下类型:
string:属性值存储为字符串。integer:属性值存储为整数。float:属性值存储为浮点数。boolean:属性值为true或false。upload:属性值为附件 URL。enum:属性值必须是choices关键字中定义的值之一。links: type: objects default: [] schema: name: link properties: name: type: enum choices: - name 1 - name 2 - name 3categories:属性值为有效分类 ID 数组。groups:属性值为有效群组 ID 数组。tags:属性值为有效标签名称数组。
定义 schema 后,现在可以通过在 yaml 中定义数组来设置设置的默认值,如下所示:
links:
type: objects
default:
- name: link 1
title: link 1 title
- name: link 2
title: link 2 title
schema:
name: link
properties:
name:
type: string
title:
type: string
必填属性
默认情况下,所有定义的属性都是可选的。要将属性标记为必填,只需使用 required: true 注解该属性。也可以使用 required: false 注解将属性标记为可选。
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
required: true
title:
type: string
required: false
自定义验证
对于某些属性类型,内置支持自定义验证,可以通过使用 validations 关键字注解属性来声明。
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
required: true
validations:
min: 1
max: 2048
url: true
string 类型的验证
min_length:属性的最小长度。关键字的值必须是整数。max_length:属性的最大长度。关键字的值必须是整数。url:验证属性是否为有效的 URL。关键字的值可以是true/false。
integer 和 float 类型的验证
min:属性的最小值。关键字的值必须是整数。max:属性的最大值。关键字的值必须是整数。
tags、groups 和 categories 类型的验证
min:属性的最小记录数。关键字的值必须是整数。max:属性的最大记录数。关键字的值必须是整数。
解析群组成员身份
对象设置可以将 type: groups 属性解析为当前用户的布尔值。当主题代码只需要知道当前用户是否在配置的群组之一中时,这非常有用,因为 currentUser.groups 仅包含对用户可见的群组。
向 groups 属性添加 resolve_group_membership: true:
menu_sections:
type: objects
default:
- name: section 1
groups:
- 1
- 3
schema:
name: menu section
properties:
name:
type: string
groups:
type: groups
resolve_group_membership: true
管理 UI 和存储的设置值仍使用原始的 groups 数组。在前端运行时 settings 对象中,Discourse 会从每个对象中移除群组 ID,并添加一个以 user_in_ 为前缀的同名布尔值:
for (const section of settings.menu_sections) {
if (section.user_in_groups) {
// 用户在该部分的至少一个选定群组中。
}
}
此选项仅对具有 type: groups 的对象 schema 属性有效。它也适用于嵌套对象 schema 以及自动群组,如 logged_in_users 和 anonymous_users。
嵌套对象结构
对象也可以包含一个由对象组成的数组作为属性。为了创建嵌套对象结构,属性也可以使用 type: objects 和相关的 schema 定义进行注解。
sections:
type: objects
default:
- name: section 1
links:
- name: link 1
url: /some/url
- name: link 2
url: /some/other/url
schema:
name: section
properties:
name:
type: string
required: true
links:
type: objects
schema:
name: link
properties:
name:
type: string
url:
type: string
设置描述和本地化
要为 en 语言环境中的设置添加描述,请创建一个文件 locales/en.yml,格式如下,针对以下 objects 类型的主题设置。
sections:
type: objects
default:
- name: section 1
links:
- name: link 1
url: /some/url
- name: link 2
url: /some/other/url
schema:
name: section
properties:
name:
type: string
required: true
links:
type: objects
schema:
name: link
properties:
name:
type: string
url:
type: string
en:
theme_metadata:
settings:
sections:
description: 这是 sections 主题设置的描述
schema:
properties:
name:
label: 名称
description: 属性的描述
links:
name:
label: 名称
description: 属性的描述
url:
label: URL
description: 属性的描述
本文档受版本控制 - 在 github 上建议更改。



