Stiamo introducendo un nuovo type: objects nei tipi supportati per le impostazioni del tema, che può essere utilizzato per sostituire il tipo json_schema esistente, che intendiamo deprecare presto.
Definizione di un’impostazione del tema di tipo objects
Per creare un’impostazione del tema di tipo objects, definisci prima una chiave di livello superiore, proprio come qualsiasi altra impostazione del tema, che verrà utilizzata come nome dell’impostazione.
links: ...
Aggiungi successivamente le parole chiave type, default e schema all’impostazione.
links:
type: objects
default: []
schema: ...
type: objects indica che si tratta di un’impostazione di tipo objects, mentre l’annotazione default: [] imposta il valore predefinito dell’impostazione su un array vuoto. Nota che il valore predefinito può anche essere impostato su un array di oggetti, cosa che dimostreremo una volta definita lo schema.
Per definire lo schema, definisci prima il name dello schema in questo modo:
links:
type: objects
default: []
schema:
name: link
Successivamente, aggiungeremo la parola chiave properties allo schema, che ci permetterà di definire e validare l’aspetto che deve avere ogni oggetto.
links:
type: objects
default: []
schema:
name: link
properties:
name: ...
Nell’esempio sopra, stabiliamo che l’oggetto link ha una proprietà name. Per definire il tipo di dati atteso, ogni proprietà deve definire la parola chiave type.
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
La definizione dello schema sopra indica che l’oggetto link ha una proprietà name di tipo string, il che significa che per la proprietà saranno accettati solo valori stringa. Attualmente sono supportati i seguenti tipi:
-
string: Il valore della proprietà viene salvato come stringa. Impostatextarea: trueper utilizzare un’area di testo espandibile:description: type: string textarea: true validations: max_length: 500 -
integer: Il valore della proprietà viene salvato come numero intero. -
float: Il valore della proprietà viene salvato come numero in virgola mobile. -
boolean: Il valore della proprietà ètrueofalse. -
upload: Il valore della proprietà è l’URL dell’allegato. -
enum: Il valore della proprietà deve essere uno dei valori definiti nella parola chiavechoices.links: type: objects default: [] schema: name: link properties: name: type: enum choices: - name 1 - name 2 - name 3 -
categories: Il valore della proprietà è un array di ID di categorie validi. -
groups: Il valore della proprietà è un array di ID di gruppi validi. -
tags: Il valore della proprietà è un array di nomi di tag validi. -
icon: Il valore della proprietà è il nome di una singola icona dall’insieme di icone di Discourse. Le icone selezionate vengono aggiunte automaticamente allo sprite sheet, quindi possono essere renderizzate senza essere registrate separatamente.
Una volta definito lo schema, il valore predefinito dell’impostazione può ora essere impostato definendo un array in yaml come segue:
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
Proprietà obbligatorie
Tutte le proprietà definite sono facoltative per impostazione predefinita. Per contrassegnare una proprietà come obbligatoria, basta annotare la proprietà con required: true. Una proprietà può essere contrassegnata come facoltativa annotandola con required: false.
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
required: true
title:
type: string
required: false
I valori vuoti di tipo string, datetime e icon e le liste vuote di categories, groups e tags contano come mancanti: le proprietà obbligatorie le rifiutano e le proprietà facoltative ne saltano la validazione. Il valore false conta come impostato.
Validazioni personalizzate
Per certi tipi di proprietà, esiste un supporto integrato per le validazioni personalizzate, che possono essere dichiarate annotando la proprietà con la parola chiave validations.
links:
type: objects
default: []
schema:
name: link
properties:
name:
type: string
required: true
validations:
min_length: 1
max_length: 2048
url: true
Validazioni per i tipi string
min_length: Lunghezza minima della proprietà. Il valore della parola chiave deve essere un intero.max_length: Lunghezza massima della proprietà. Il valore della parola chiave deve essere un intero.url: Valida che la proprietà sia un URL valido. Il valore della parola chiave può esseretrue/false.
Validazioni per i tipi integer e float
min: Valore minimo della proprietà. Il valore della parola chiave deve essere un intero.max: Valore massimo della proprietà. Il valore della parola chiave deve essere un intero.
Validazioni per i tipi tags, groups e categories
min: Numero minimo di record per la proprietà. Il valore della parola chiave deve essere un intero.max: Numero massimo di record per la proprietà. Il valore della parola chiave deve essere un intero.
Risoluzione dell’appartenenza ai gruppi
Le impostazioni degli oggetti possono risolvere le proprietà type: groups in un valore booleano per l’utente attuale. Questo è utile quando il codice del tema deve sapere solo se l’utente attuale appartiene a uno dei gruppi configurati, poiché currentUser.groups include solo i gruppi visibili all’utente.
Aggiungi resolve_group_membership: true alla proprietà groups:
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
L’interfaccia di amministrazione e il valore dell’impostazione salvato utilizzano ancora l’array groups originale. Nell’oggetto settings del runtime frontend, Discourse rimuove gli ID dei gruppi da ogni oggetto e aggiunge un booleano con lo stesso nome di proprietà, preceduto da user_in_:
for (const section of settings.menu_sections) {
if (section.user_in_groups) {
// L'utente appartiene ad almeno un gruppo selezionato per questa sezione.
}
}
Questa opzione è valida solo per le proprietà dello schema degli oggetti con type: groups. Funziona anche con gli schemi di oggetti nidificati e con i gruppi automatici come logged_in_users e anonymous_users.
Struttura degli oggetti nidificati
Un oggetto può anche avere una proprietà che contiene un array di oggetti. Per creare una struttura di oggetti nidificati, una proprietà può anche essere annotata con type: objects e la relativa definizione di 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
Descrizione e localizzazione dell’impostazione
Per aggiungere una descrizione per l’impostazione nella locale en, crea un file locales/en.yml con il seguente formato, data la seguente impostazione del tema di tipo 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: Questa è una descrizione per l'impostazione del tema sections
schema:
properties:
name:
label: Nome
description: La descrizione per la proprietà
links:
name:
label: Nome
description: La descrizione per la proprietà
url:
label: URL
description: La descrizione per la proprietà
Questo documento è sottoposto a controllo di versione - suggerisci modifiche su github.



