Wir führen einen neuen type: objects für die unterstützten Typen für Theme-Einstellungen ein, der verwendet werden kann, um den vorhandenen json_schema-Typ zu ersetzen, den wir bald veralten lassen werden.
Definieren einer objects-Typ-Theme-Einstellung
Um eine objects-Typ-Theme-Einstellung zu erstellen, definieren Sie zunächst einen Schlüssel auf oberster Ebene, genau wie bei jeder anderen Theme-Einstellung, der als Name der Einstellung verwendet wird.
links: ...
Fügen Sie der Einstellung anschließend die Schlüsselwörter type, default und schema hinzu.
links:
type: objects
default: []
schema: ...
type: objects gibt an, dass es sich um eine objects-Typ-Einstellung handelt, während die Angabe default: [] den Standardwert der Einstellung auf ein leeres Array setzt. Beachten Sie, dass der Standardwert auch auf ein Array von Objekten gesetzt werden kann, was wir demonstrieren werden, sobald das schema definiert ist.
Um das Schema zu definieren, definieren Sie zunächst den name des Schemas wie folgt:
links:
type: objects
default: []
schema:
name: link
Als Nächstes fügen wir dem Schema das Schlüsselwort properties hinzu, mit dem wir definieren und validieren können, wie jedes Objekt aussehen soll.
links:
type: objects
default: []
schema:
name: link
properties:
name: ...
Im obigen Beispiel geben wir an, dass das link-Objekt eine name-Eigenschaft hat. Um den erwarteten Datentyp zu definieren, muss jede Eigenschaft das Schlüsselwort type definieren.
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
Die obige Schema-Definition besagt, dass das link-Objekt eine name-Eigenschaft vom Typ string hat, was bedeutet, dass für die Eigenschaft nur Zeichenkettenwerte akzeptiert werden. Derzeit werden die folgenden Typen unterstützt:
string: Der Wert der Eigenschaft wird als Zeichenkette gespeichert.integer: Der Wert der Eigenschaft wird als Ganzzahl gespeichert.float: Der Wert der Eigenschaft wird als Gleitkommazahl gespeichert.boolean: Der Wert der Eigenschaft isttrueoderfalse.upload: Der Wert der Eigenschaft ist die URL des Anhangsenum: Der Wert der Eigenschaft muss einer der im Schlüsselwortchoicesdefinierten Werte sein.links: type: objects default: [] schema: name: link properties: name: type: enum choices: - name 1 - name 2 - name 3categories: Der Wert der Eigenschaft ist ein Array gültiger Kategorie-IDs.groups: Der Wert der Eigenschaft ist ein Array gültiger Gruppen-IDs.tags: Der Wert der Eigenschaft ist ein Array gültiger Tag-Namen.icon: Der Wert der Eigenschaft ist der Name eines einzelnen Icons aus dem Discourse-Icon-Set. Ausgewählte Icons werden automatisch dem Spritesheet hinzugefügt, sodass sie ohne separate Registrierung gerendert werden können.
Sobald das Schema definiert ist, kann der Standardwert der Einstellung durch die Definition eines Arrays in YAML wie folgt gesetzt werden:
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
Pflichtfelder
Alle definierten Eigenschaften sind standardmäßig optional. Um eine Eigenschaft als erforderlich zu markieren, fügen Sie der Eigenschaft einfach die Angabe required: true hinzu. Eine Eigenschaft kann auch als optional markiert werden, indem der Eigenschaft required: false hinzugefügt wird.
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
required: true
title:
type: string
required: false
Benutzerdefinierte Validierungen
Für bestimmte Eigenschaftstypen gibt es eine eingebaute Unterstützung für benutzerdefinierte Validierungen, die durch die Angabe des Schlüsselworts validations bei der Eigenschaft deklariert werden können.
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
required: true
validations:
min: 1
max: 2048
url: true
Validierungen für string-Typen
min_length: Minimale Länge der Eigenschaft. Der Wert des Schlüsselworts muss eine Ganzzahl sein.max_length: Maximale Länge der Eigenschaft. Der Wert des Schlüsselworts muss eine Ganzzahl sein.url: Validiert, dass die Eigenschaft eine gültige URL ist. Der Wert des Schlüsselworts kanntrue/falsesein.
Validierungen für integer- und float-Typen
min: Minimalwert der Eigenschaft. Der Wert des Schlüsselworts muss eine Ganzzahl sein.max: Maximalwert der Eigenschaft. Der Wert des Schlüsselworts muss eine Ganzzahl sein.
Validierungen für tags-, groups- und categories-Typen
min: Minimale Anzahl an Datensätzen für die Eigenschaft. Der Wert des Schlüsselworts muss eine Ganzzahl sein.max: Maximale Anzahl an Datensätzen für die Eigenschaft. Der Wert des Schlüsselworts muss eine Ganzzahl sein.
Auflösen der Gruppenmitgliedschaft
Objektesteinstellungen können type: groups-Eigenschaften für den aktuellen Benutzer auf einen booleschen Wert auflösen. Dies ist nützlich, wenn der Theme-Code nur wissen muss, ob der aktuelle Benutzer in einer der konfigurierten Gruppen ist, da currentUser.groups nur Gruppen enthält, die für den Benutzer sichtbar sind.
Fügen Sie der groups-Eigenschaft resolve_group_membership: true hinzu:
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
Die Admin-Oberfläche und der gespeicherte Einstellungswert verwenden weiterhin das ursprüngliche groups-Array. Im Frontend-Runtime-settings-Objekt entfernt Discourse die Gruppen-IDs aus jedem Objekt und fügt einen booleschen Wert mit demselben Eigenschaftsnamen hinzu, der mit user_in_ beginnt:
for (const section of settings.menu_sections) {
if (section.user_in_groups) {
// User is in at least one selected group for this section.
}
}
Diese Option ist nur für Objektschema-Eigenschaften mit type: groups gültig. Sie funktioniert auch mit verschachtelten Objektschemata und mit automatischen Gruppen wie logged_in_users und anonymous_users.
Verschachtelte Objektstruktur
Ein Objekt kann auch eine Eigenschaft haben, die ein Array von Objekten enthält. Um eine verschachtelte Objektstruktur zu erstellen, kann eine Eigenschaft auch mit type: objects und der zugehörigen schema-Definition annotiert werden.
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
Beschreibung und Lokalisierung der Einstellung
Um eine Beschreibung für die Einstellung im en-Locale hinzuzufügen, erstellen Sie eine Datei locales/en.yml mit dem folgenden Format, basierend auf der folgenden objects-Typ-Theme-Einstellung.
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: This is a description for the sections theme setting
schema:
properties:
name:
label: Name
description: The description for the property
links:
name:
label: Name
description: The description for the property
url:
label: URL
description: The description for the property
Dieses Dokument wird versioniert verwaltet - schlagen Sie Änderungen auf GitHub vor.



