# Tipo di oggetto per la configurazione del tema

**URL:** https://meta.discourse.org/t/objects-type-for-theme-setting/305009
**Category:** Developer Guides
**Tags:** how-to, theme-guides
**Created:** [23 Aprile 2024, 6:24am UTC](https://meta.discourse.org/t/objects-type-for-theme-setting/305009 "2024-04-23T06:24:06Z")
**Posts on this page:** 1
**Showing post:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [23 Aprile 2024, 6:24am UTC](https://meta.discourse.org/t/objects-type-for-theme-setting/305009/1 "2024-04-23T06:24:06Z")

</div>

Stiamo introducendo un nuovo `type: objects` tra [i tipi supportati per le impostazioni del tema](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557#symbols-supported-types-2), che può essere utilizzato per sostituire il tipo `json_schema` esistente, che intendiamo deprecare a breve.

### Definire un’impostazione del tema di tipo objects

Per creare un’impostazione del tema di tipo objects, prima di tutto definisci una chiave di livello superiore, proprio come per qualsiasi altra impostazione del tema, che verrà utilizzata come nome dell’impostazione.

```yaml
links: ...

```

Successivamente, aggiungi le parole chiave `type`, `default` e `schema` all’impostazione.

```yaml
links:
  type: objects
  default: []
  schema: ...

```

`type: objects` indica che questa sarà 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 la `schema`.

Per definire lo schema, prima di tutto definisci il `name` dello schema in questo modo:

```yaml
links:
  type: objects
  default: []
  schema:
    name: link

```

Successivamente, aggiungeremo la parola chiave `properties` allo schema, che ci permetterà di definire e validare come dovrebbe apparire ciascun oggetto.

```yaml
links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name: ...

```

Nell’esempio sopra, stiamo dichiarando che l’oggetto `link` ha una proprietà `name`. Per definire il tipo di dati atteso, ogni proprietà deve definire la parola chiave `type`.

```yaml
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 verranno accettati solo valori stringa per la proprietà. Attualmente sono supportati i seguenti tipi:

- `string`: Il valore della proprietà viene memorizzato come stringa.
- `integer`: Il valore della proprietà viene memorizzato come intero.
- `float`: Il valore della proprietà viene memorizzato come numero a virgola mobile.
- `boolean`: Il valore della proprietà è `true` o `false`.
- `upload`: Il valore della proprietà è l’URL dell’allegato
- `enum`: Il valore della proprietà deve essere uno dei valori definiti nella parola chiave `choices`.

```yaml
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 categoria validi.
- `groups`: Il valore della proprietà è un array di ID gruppo validi.
- `tags`: Il valore della proprietà è un array di nomi tag validi.
- `icon`: Il valore della proprietà è il nome di un’icona singola dal set di icone di Discourse. Le icone selezionate vengono aggiunte automaticamente al foglio sprite, quindi possono essere renderizzate senza essere registrate separatamente.

Con lo schema definito, il valore predefinito dell’impostazione può ora essere impostato definendo un array in yaml in questo modo:

```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

```

#### Proprietà obbligatorie

Tutte le proprietà definite sono opzionali di default. Per contrassegnare una proprietà come obbligatoria, è sufficiente annotare la proprietà con `required: true`. Una proprietà può anche essere contrassegnata come opzionale annotandola con `required: false`.

```yaml
links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
      title:
        type: string
        required: false

```

#### Validazioni personalizzate

Per determinati tipi di proprietà, esiste un supporto integrato per le validazioni personalizzate, che possono essere dichiarate annotando la proprietà con la parola chiave `validations`.

```yaml
links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
        validations:
          min: 1
          max: 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`: Convalida che la proprietà sia un URL valido. Il valore della parola chiave può essere `true/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 di tipo oggetto possono risolvere le proprietà `type: groups` in un valore booleano per l’utente corrente. Questo è utile quando il codice del tema ha bisogno solo di sapere se l’utente corrente fa parte di uno dei gruppi configurati, perché `currentUser.groups` include solo i gruppi visibili all’utente.

Aggiungi `resolve_group_membership: true` alla proprietà `groups`:

```yaml
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 memorizzato utilizzano ancora l’array `groups` originale. Nell’oggetto `settings` di runtime del frontend, Discourse rimuove gli ID dei gruppi da ciascun oggetto e aggiunge un booleano con lo stesso nome di proprietà prefissato da `user_in_`:

```gjs
for (const section of settings.menu_sections) {
  if (section.user_in_groups) {
    // L'utente fa parte di almeno un gruppo selezionato per questa sezione.
  }
}

```

Questa opzione è valida solo per le proprietà degli schemi di oggetto con `type: groups`. Funziona anche per gli schemi di oggetti annidati e con i gruppi automatici come `logged_in_users` e `anonymous_users`.

#### Struttura di oggetti annidati

Un oggetto può anche avere una proprietà che contiene un array di oggetti. Per creare una struttura di oggetti annidati, una proprietà può anche essere annotata con `type: objects` e la definizione `schema` associata.

```yaml
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 dell’impostazione e localizzazione

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.

```yaml
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

```

```yaml
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

```

* * *

Questo documento è sottoposto a controllo di versione - suggerisci modifiche [su github](https://github.com/discourse/discourse/blob/main/docs/developer-guides/docs/05-themes-components/10-objects-for-theme-settings.md).

---

_[View the full topic](https://meta.discourse.org/t/objects-type-for-theme-setting/305009)._
