Type d'objets pour le paramètre de thème

Nous introduisons un nouveau type: objects dans les types pris en charge pour les paramètres de thème qui peut être utilisé pour remplacer le type existant json_schema que nous avons l’intention de déprécier bientôt.

Définir un paramètre de thème de type objets

Pour créer un paramètre de thème de type objets, définissez d’abord une clé de niveau supérieur comme pour tout paramètre de thème, qui sera utilisée comme nom du paramètre.

links: ...

Ajoutez ensuite les mots-clés type, default et schema au paramètre.

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

type: objects indique qu’il s’agira d’un paramètre de type objets, tandis que l’annotation default: [] définit la valeur par défaut du paramètre comme un tableau vide. Notez que la valeur par défaut peut également être définie comme un tableau d’objets, ce que nous démontrerons une fois que le schema aura été défini.

Pour définir le schéma, définissez d’abord le name du schéma comme suit :

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

Ensuite, nous ajouterons le mot-clé properties au schéma, ce qui nous permettra de définir et de valider l’apparence de chaque objet.

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

Dans l’exemple ci-dessus, nous indiquons que l’objet link a une propriété name. Pour définir le type de données attendu, chaque propriété doit définir le mot-clé type.

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string

La définition du schéma ci-dessus indique que l’objet link a une propriété name de type string, ce qui signifie que seules des valeurs de chaîne seront acceptées pour cette propriété. Actuellement, les types suivants sont pris en charge :

  • string : La valeur de la propriété est stockée sous forme de chaîne.
  • integer : La valeur de la propriété est stockée sous forme d’entier.
  • float : La valeur de la propriété est stockée sous forme de nombre à virgule flottante.
  • boolean : La valeur de la propriété est true ou false.
  • enum : La valeur de la propriété doit être l’une des valeurs définies dans le mot-clé choices.
    links:
      type: objects
      default: []
      schema:
        name: link
        properties:
          name:
            type: enum
            choices:
              - name 1
              - name 2
              - name 3
    
  • categories : La valeur de la propriété est un tableau d’identifiants de catégories valides.
  • groups : La valeur de la propriété est un tableau d’identifiants de groupes valides.
  • tags : La valeur de la propriété est un tableau de noms de tags valides.

Une fois le schéma défini, la valeur par défaut du paramètre peut maintenant être définie en définissant un tableau en yaml comme suit :

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

Propriétés requises

Toutes les propriétés définies sont facultatives par défaut. Pour marquer une propriété comme requise, annotez simplement la propriété avec required: true. Une propriété peut également être marquée comme facultative en l’annotant avec required: false.

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

Validations personnalisées

Pour certains types de propriétés, il existe un support intégré pour les validations personnalisées qui peuvent être déclarées en annotant la propriété avec le mot-clé validations.

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
        validations:
          min: 1
          max: 2048
          url: true

Validations pour les types string

  • min_length : Longueur minimale de la propriété. La valeur du mot-clé doit être un entier.
  • max_length : Longueur maximale de la propriété. La valeur du mot-clé doit être un entier.
  • url : Valide que la propriété est une URL valide. La valeur du mot-clé peut être true/false.

Validations pour les types integer et float

  • min : Valeur minimale de la propriété. La valeur du mot-clé doit être un entier.
  • max : Valeur maximale de la propriété. La valeur du mot-clé doit être un entier.

Validations pour les types tags, groups et categories

  • min : Nombre minimum d’enregistrements pour la propriété. La valeur du mot-clé doit être un entier.
  • max : Nombre maximum d’enregistrements pour la propriété. La valeur du mot-clé doit être un entier.

Structure d’objets imbriqués

Un objet peut également avoir une propriété contenant un tableau d’objets. Pour créer une structure d’objets imbriqués, une propriété peut également être annotée avec type: objects et la définition de schema associée.

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

Description et localisation des paramètres

Pour ajouter une description au paramètre dans la locale en, créez un fichier locales/en.yml avec le format suivant, étant donné le paramètre de thème de type objets suivant.

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: Ceci est une description pour le paramètre de thème des sections
        schema:
          properties:
            name:
              label: Nom
              description: La description de la propriété
            links:
              name:
                label: Nom
                description: La description de la propriété
              url:
                label: URL
                description: La description de la propriété

Ce document est contrôlé par version - suggérez des modifications sur github.

15 « J'aime »

Je reste à convaincre que la dépréciation du style de schéma JSON est une bonne idée.

Bien que ceux-ci puissent devenir assez complexes et ne soient pas les formats les plus "conviviaux pour les développeurs" (c’est donc un excellent changement à cet égard), il existe des outils en ligne pour valider les schémas JSON, ce qui est un moyen très utile de valider à la fois le schéma et par rapport à toute donnée par défaut.

par exemple https://www.jsonschemavalidator.net/

Comment cela fonctionnera-t-il dans ce nouveau monde ?

2 « J'aime »

Lors du téléchargement d’un thème, nous validerons les données par défaut par rapport au schéma défini. Cela étant dit, nous ne validons pas que la définition du schéma est valide actuellement, mais il ne serait pas difficile pour nous de le faire. Même pour le paramètre de schéma json actuel, je ne pense pas que nous validions les données par défaut par rapport au schéma défini.

Notre implémentation actuelle des paramètres de type de schéma json est en quelque sorte défectueuse à bien des égards, le plus évident étant l’éditeur dans l’interface d’administration. Nous en avons discuté en interne et avons décidé qu’il nous était beaucoup plus facile de maintenir un format de schéma limité défini par nous plutôt que d’autoriser toutes les possibilités qui accompagnent le schéma json.

2 « J'aime »

Quelques fonctionnalités intéressantes ici :

  • vous pouvez vous débarrasser de JSON.parse et accéder directement au paramètre pour obtenir l’objet, ce qui est vraiment bien.

  • le validateur d’URL !

:chefs_kiss: :chefs_kiss:

5 « J'aime »

Y a-t-il un moyen de respecter plusieurs lignes dans l’éditeur ?

Ceci par défaut fonctionne :

- name: markdown
  value: > 
    ## Heading
      * first bullet
      * second bullet

Mais une fois que vous modifiez cela, les retours chariot sont perdus

De plus, il serait agréable d’avoir un type « text » qui pourrait stocker des données plus longues et éventuellement exposer un éditeur « text-area » plus grand.

5 « J'aime »

Voici quelques retours :

2 « J'aime »

J’ai remarqué cela et cela a été corrigé dans

1 « J'aime »

Serons-nous en mesure de réorganiser les éléments sur l’interface ?

Par exemple, voici l’éditeur de paramètres d’objet sur le composant de thème “easy footer”. Je ne peux réorganiser aucun élément pour le moment :

4 « J'aime »

Je voulais également demander cette fonctionnalité ! :+1:


Par ailleurs, il serait utile que le premier message contienne des informations sur la propriété identifier.

Avant de regarder l’image de Nolo ci-dessus, je pensais qu’il était impossible de remplacer le libellé enfant par défaut par une valeur de propriété. Après avoir examiné le code, j’ai trouvé la propriété identifier.

4 « J'aime »

La réorganisation est certainement quelque chose qui a été évoqué en interne également. J’essaierai de la mettre en place cette semaine.

Noté. Je mettrai à jour le premier message concernant la propriété identifier.

4 « J'aime »

Oui, pour remplacer le système json (qui deviendra bientôt obsolète ?) il doit correspondre ou dépasser l’ancienne interface :

y compris le tri.

1 « J'aime »

Bonjour, y a-t-il des projets pour prendre en charge d’autres types de champs bientôt ?

Par exemple ;

  • une long_string avec format markdown ; peut-être avec une barre d’outils personnalisable,
  • un champ date (avec des règles de validation),
  • un champ color (avec des règles de validation) ?
1 « J'aime »

Il n’y a pas de plan actuel, bien que je sois d’accord sur le fait que ce serait utile. J’aimerais moi-même un champ icon.

7 « J'aime »

D’après mon expérience, cela semble fonctionner comme des préréglages enregistrés. Dans cet exemple, les 2 premières entrées pourraient bénéficier de ces préréglages, mais tout ce qui vient après, toutes les nouvelles entrées apparaîtront initialement vides.

Cela signifie également que nous ne pouvons pas définir de valeurs par défaut pour chaque champ. Par exemple, si je veux qu’une case à cocher soit cochée par défaut, je ne peux pas le faire.

links:
  type: objects
  default:
    - name: link 1
      title: link 1 title
    - name: link 2
      title: link 2 title
  schema:
    name: link
    properties:
      is_active:
        type: boolean
        default: true 

default: true ne fonctionnera pas comme prévu.

Y aurait-il un moyen de définir les valeurs par défaut par champ, pour chaque entrée créée ?

Existe-t-il un moyen d’importer les propriétés d’un objet dans des variables en Sass ?

Vous pouvez toujours analyser la chaîne, mais ce n’est pas une très bonne idée à promouvoir de cette façon. :sweat_smile:

1 « J'aime »

Merci d’avoir partagé l’exemple ! Bien que oui… ça n’a pas l’air très tentant :upside_down_face:

1 « J'aime »

Par curiosité, sans y passer trop de temps, où en sommes-nous avec cela ?

2 « J'aime »

Oui, ce n’est pas très bon, ne le faites pas. :smile:. C’était plus une tentative de voir si c’était possible, mais pas une approche raisonnable.
Je suis d’accord avec vous ; ce serait bien d’avoir un moyen direct ! :+1:

J’aimerais savoir aussi !
Aussi, si j’ai bien compris, ce serait la seule fonctionnalité manquante par rapport à json_schema.

2 « J'aime »

Je cherchais le type de téléversement disponible, mais il ne l’est pas. Un rapide coup d’œil au cœur montre que les types sujet, publication et téléversement ont été implémentés côté serveur mais pas côté client. Y a-t-il une raison spécifique à cela ? :thinking: