Ajouter des paramètres à votre thème Discourse

Discourse permet aux thèmes de posséder des « réglages » que les développeurs de thèmes peuvent ajouter afin de permettre aux propriétaires de sites de personnaliser les thèmes via l’interface utilisateur, sans avoir à modifier une seule ligne de code et sans craindre de perdre leurs modifications lors des mises à jour futures du thème.

Les thèmes peuvent également modifier certains réglages de site personnalisables. Pour plus d’informations à ce sujet, consultez le sujet Réglages de site personnalisables.

:heavy_plus_sign: Ajout de réglages à votre thème

L’ajout de réglages à votre thème diffère un peu de l’ajout de code CSS et JS, car il n’y a pas de moyen de le faire via l’interface utilisateur.

La façon d’ajouter des réglages consiste à créer un dépôt pour votre thème et, dans le dossier racine de votre dépôt, à créer un nouveau fichier settings.yaml (ou settings.yml). Dans ce fichier, vous utiliserez le langage YAML pour définir vos réglages de thème.

:loudspeaker: Note : Vous pourriez trouver utile de vous servir de l’interface en ligne de commande pour les thèmes (Theme CLI), qui simplifie considérablement le processus de développement.

Si vous êtes familier avec le développement de plugins, cela ne devrait pas être nouveau pour vous - cela fonctionne principalement de la même manière que l’ajout de réglages de site à votre plugin. Il suffit de saisir du YAML valide dans votre fichier de réglages et vous serez prêt à partir.

Un réglage de thème valide doit avoir un nom et une valeur par défaut, c’est le minimum requis et cela ressemble à ceci :

simple_setting: true

Comme vous pouvez probablement le deviner, cela créera un réglage nommé simple_setting et il aura true comme valeur par défaut.

De même, vous pouvez ajouter quelque chose comme ceci :

site_name: My Forums
max_avatars: 7

Et vous aurez deux réglages de plus, site_name qui sera un réglage de type chaîne avec “My Forums” comme valeur par défaut, et max_avatars comme réglage de type entier avec une valeur par défaut de 7.

Vous pouvez accéder à vos réglages dans votre code JS comme ceci : settings.your_setting_key.

Jusqu’à présent, nous avons couvert la manière la plus simple de définir des réglages. Dans la section suivante, nous approfondirons un peu les différents types de réglages et comment vous pouvez les utiliser.

:symbols: Types pris en charge

Il existe 9 types de réglages :

  1. integer
  2. float
  3. string
  4. bool (pour booléen)
  5. list
  6. enum
  7. objects (remplacement de json_schema)
  8. upload (pour les images)
  9. icon (pour une icône unique du jeu d’icônes Discourse)

Et vous pouvez spécifier le type en ajoutant un attribut type à votre réglage comme ceci :

float_setting:
  type: float
  default: 3.14

Je devrais dire que vous n’avez pas toujours besoin de définir explicitement un attribut type, car Discourse est assez intelligent pour déterminer le type de réglage à partir de la valeur par défaut du réglage. Vous pouvez donc réduire l’exemple ci-dessus à ceci :

float_setting:
  default: 3.14

Cela dit, vous devez définir un attribut de type lorsque vous travaillez avec des réglages list, enum et icon, sinon Discourse ne les reconnaîtra pas correctement.

Réglage de liste (List Setting) :

whitelisted_fruits:
  default: apples|oranges
  type: list

Réglage d’énumération (Enum Setting) :

favorite_fruit:
  default: orange
  type: enum
  choices:
    - apple
    - banana

Au cas où la différence entre les réglages de liste et d’énumération ne serait pas claire pour vous : les réglages d’énumération permettent à vos utilisateurs de thème de sélectionner uniquement une valeur parmi un ensemble de valeurs défini par vous (voir l’attribut choices).

En revanche, les réglages de liste permettent à vos utilisateurs de créer leur propre liste (c’est-à-dire un tableau) de valeurs. Ils peuvent ajouter ou supprimer des éléments de la liste de valeurs par défaut du réglage.
Vous pouvez définir la liste de valeurs par défaut du réglage en joignant les valeurs avec le caractère barre verticale |. Voir le réglage de liste dans l’exemple ci-dessus.

Vous pouvez voir un cas d’utilisation réel pour les réglages de liste ici : Auto-Linkify Words.

:loudspeaker: Note : Faites attention à l’indentation lorsque vous travaillez avec YAML, car YAML est très exigeant quant aux espaces et lancera une erreur de syntaxe si l’indentation de votre code est incorrecte.

Réglage d’icône (Icon Setting) :

banner_icon:
  default: bullhorn
  type: icon

Les réglages d’icône offrent aux propriétaires de sites un sélecteur d’icônes avec recherche, et la valeur est le nom de l’icône. Discourse ajoute l’icône sélectionnée à la feuille de sprites, vous pouvez donc l’afficher dans votre thème sans avoir à l’enregistrer séparément.

Type objects

Le type de réglage objects est un type spécial qui vous permet d’accomplir des réglages avancés avec une structure et des validations personnalisées. Nous avons une documentation séparée pour ce type.

:capital_abcd: Description et localisations des réglages

Vous pouvez ajouter un texte de description à votre réglage de thème et il s’affichera comme une étiquette directement sous le réglage. Pour cela, il suffit d’ajouter un attribut description à votre réglage comme suit :

whitelisted_fruits:
  default: apples|oranges
  type: list
  description: "Ce texte sera affiché sous ce réglage et il explique ce que fait le réglage !"

Et vous obtiendrez ceci :

Prise en charge de plusieurs langues

Si vous connaissez plus d’une langue et que vous souhaitez ajouter la prise en charge de ces langues à votre thème, vous pouvez tout à fait le faire, à condition que Discourse prenne en charge ces langues.

Tout d’abord, assurez-vous que la langue que vous souhaitez prendre en charge figure dans cette liste :

Liste des langues
Code Name
ar اللغة العربية
bs_BA bosanski jezik
ca català
cs čeština
da dansk
de Deutsch
el ελληνικά
en English
es Español
et eesti
fa_IR فارسی
fi suomi
fr Français
gl galego
he עברית
id Indonesian
it Italiano
ja 日本語
ko 한국어
lv latviešu valoda
nb_NO Norsk bokmål
nl Nederlands
pl_PL język polski
pt Português
pt_BR Português (BR)
ro limba română
ru Русский
sk slovenčina
sq Shqip
sr српски језик
sv svenska
te తెలుగు
th ไทย
tr_TR Türkçe
uk українська мова
ur اردو
vi Việt Nam
zh_CN 中文
zh_TW 中文 (TW)

(Si vous ne voyez pas votre langue dans la liste, vous voudrez peut-être jeter un œil à How to add a new language)

Ensuite, vous devrez trouver le code de votre langue dans la liste ci-dessus et utiliser le code de langue comme clé sous l’attribut description et la traduction comme valeur pour la clé comme suit :

whitelisted_fruits:
  default: apples|oranges
  type: list
  description:
    en: English text
    ar: نص باللغة العربية
    fr: Texte français

Et maintenant vous avez la prise en charge de 3 langues : l’anglais, l’arabe et le français.

Attributs et options de réglage supplémentaires

Attributs min et max

Parfois, vous pouvez avoir besoin de spécifier des limites qu’une valeur de réglage ne peut pas dépasser pour empêcher vos utilisateurs de casser accidentellement le thème ou peut-être tout le site.

Pour spécifier des limites, il suffit d’ajouter un attribut min ou max ou les deux à votre réglage comme suit :

integer_setting:
  default: 10
  min: 5
  max: 100

Vous pouvez spécifier des limites pour les réglages de type integer, float et string. Pour les réglages integer et float, la valeur du réglage lui-même est vérifiée par rapport aux limites. Et pour les réglages string, la longueur de la valeur est vérifiée par rapport aux limites spécifiées.

Si votre utilisateur essaie de saisir une valeur qui n’est pas dans la plage autorisée, il verra une erreur lui indiquant quelles sont les valeurs min et max.

Accès aux réglages dans votre JS/CSS/Handlebars

Les réglages de thème sont rendus disponibles globalement en tant que variable settings dans les fichiers JavaScript de thème. Par exemple :

// {theme}/javascripts/discourse/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  console.log("settings are", settings);
});

Cet objet settings est également utilisable normalement dans les balises <template> .gjs.

Définition de variables CSS

En CSS, une variable sera créée pour chaque réglage de votre thème et chaque variable aura le même nom que le réglage qu’elle représente.

Donc, si vous aviez un réglage flottant nommé global_font_size et un réglage de chaîne nommé site_background, vous pourriez faire quelque chose comme ceci dans votre CSS de thème :

html {
  font-size: #{$global-font-size}px;
  background: $site-background;
}

Résolution de l’appartenance aux groupes

Les composants de thème ont parfois besoin d’afficher ou de masquer une fonctionnalité en fonction de savoir si l’utilisateur actuel appartient à un groupe configuré. Évitez de vérifier currentUser.groups pour cela, car cela n’inclut que les groupes visibles pour l’utilisateur, et cela peut manquer des groupes cachés.

Pour les réglages de liste basés sur des groupes, ajoutez resolve_group_membership: true pour résoudre la vérification côté serveur :

copy_button_allowed_groups:
  default: "1|3"
  type: list
  list_type: group
  resolve_group_membership: true

Cette option n’est valide que lorsque le réglage a type: list et list_type: group. Lorsqu’elle est activée, l’objet settings du frontend n’inclut pas la liste de groupes originale. Au lieu de cela, Discourse ajoute un booléen avec le même nom de réglage préfixé par user_in_ :

// {theme}/javascripts/discourse/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  if (!settings.user_in_copy_button_allowed_groups) {
    return;
  }

  // User is in at least one selected group.
});

Le booléen généré fonctionne également avec les groupes automatiques tels que logged_in_users et anonymous_users. Les réglages de thème de type objet peuvent utiliser la même option sur les propriétés type: groups. Voir Type objects pour les réglages de thème pour plus de détails.

:link: Sujets liés


Ce document est sous contrôle de version - suggérez des modifications sur github.

54 « J'aime »