Modificateurs de thème : Une brève introduction

Alors que les thèmes deviennent plus ambitieux, nous cherchons des moyens de leur permettre de manipuler le comportement principal côté serveur. Bien qu’ils ne disposeront jamais du même niveau de contrôle que les plugins, nous pouvons fournir quelques crochets prédéfinis que les thèmes peuvent manipuler.

Présentation des modificateurs de thème :partying_face:

Ils sont spécifiés en utilisant la clé modifiers dans le fichier about.json de votre thème.

Pour une liste complète et à jour des modificateurs, consultez le schéma de base de données au bas de theme_modifier_set.rb, mais voici un bref résumé de ce que nous avons jusqu’à présent :

  • serialize_topic_excerpts booléen (défaut faux) - inclure toujours des extraits lors de la sérialisation des listes de sujets

  • csp_extensions tableau de chaînes - ajouter des directives au CSP. Fonctionne de la même manière que l’ancienne méthode de paramètre de thème “extend_content_security_policy”. Mais rappelez-vous, les balises simples \u003cscript src=\"\"\u003e sont automatiquement autorisées.

  • svg_icons tableau de chaînes - une liste d’icônes qui doivent être incluses dans le sous-ensemble d’icônes

  • topic thumbnails tableau de dimensions - demander des résolutions supplémentaires dans l’ensemble de miniatures de sujet. Notez qu’elles sont générées de manière asynchrone, vous devez donc revenir à l’image d’origine si la taille demandée n’est pas fournie. Plus d’informations disponibles dans le message de commit

  • serialize_post_user_badges tableau de chaînes - une liste de noms d’insignes (correspondant aux entrées dans la table badges) à sérialiser avec les données de publication. Lorsqu’il est configuré, le système inclut les badges d’utilisateur spécifiés avec chaque publication pour le rendu côté client.

Un thème qui utilise intensivement ces nouveaux crochets est Topic List Thumbnails - consultez le code pour voir comment il fonctionne.

Modificateurs dépendants des paramètres

Les modificateurs de thème peuvent également être configurés pour extraire leur valeur d’un paramètre de thème, permettant aux opérateurs de site de remplacer le comportement du modificateur sans modifier le code du thème. Pour qu’un modificateur dépende d’un paramètre, utilisez cette syntaxe dans votre about.json :

{
  "modifiers": {
    "modifier_name": {
      "type": "setting",
      "value": "setting_name"
    }
  }
}

Par exemple, si vous avez un paramètre de thème appelé show_excerpts et que vous souhaitez qu’il contrôle le modificateur serialize_topic_excerpts :

Dans settings.yml :

show_excerpts:
  default: false

Dans about.json :

{
  "modifiers": {
    "serialize_topic_excerpts": {
      "type": "setting",
      "value": "show_excerpts"
    }
  }
}

Lorsque le paramètre show_excerpts est modifié, la valeur du modificateur sera automatiquement mise à jour pour correspondre. Cela offre une flexibilité aux opérateurs de site pour personnaliser le comportement du thème via l’interface d’administration.


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

35 « J'aime »

David, c’est probablement un peu paresseux de ma part de demander, mais y a-t-il un moyen d’y accéder dans un plugin :

Les thèmes peuvent demander des tailles de vignettes supplémentaires en utilisant un modificateur dans leur fichier about.json :

Je vais tenter de migrer le plugin TLP vers ce nouveau schéma, et il serait utile d’avoir le même accès aux fonctionnalités depuis un plugin, du moins pour l’instant.

2 « J'aime »

Il n’y en a pas pour le moment, mais je vais m’en occuper :eyes:

6 « J'aime »

David, quelle est la bonne approche pour la recréation en VOLUME des vignettes ?

Je viens d’essayer de l’utiliser sur l’un de mes sites et il semble avoir traité environ 10 % des sujets… puis avoir abandonné (ou avoir fait la fine bouche pour le reste). Je pense que c’est le premier cas car les sujets pour lesquels des vignettes ont été générées sont les 10 % les plus récents.

Le rebaking des posts ne semble pas suffire. En fait, j’ai exécuté un rebaking en volume et je me demande si cela n’a pas perturbé le processus…

Je remarque que image_url peut être renseigné, mais qu’il n’y a pas de vignettes.

Tout conseil est apprécié !

1 « J'aime »

Cette colonne ne sert à rien et sera supprimée très prochainement. C’est image_upload_id qu’il vous faut.

Cela ne devrait pas être nécessaire. J’ai délibérément conçu le système pour que les utilisateurs puissent installer de nouveaux thèmes sans avoir à intervenir sur la console. Les vignettes sont générées de manière asynchrone selon les besoins. Par exemple :

  • vous ajoutez un nouveau thème qui demande de nouvelles résolutions
  • un utilisateur demande un sujet, nous servons les vignettes existantes. Si certaines tailles n’existent pas, nous planifions un travail Sidekiq.
  • la prochaine fois que quelqu’un demandera le sujet, les vignettes correctes seront disponibles

Si la taille de vignette demandée est plus grande que l’original, nous ne nous embêterons pas à générer la vignette.

L’élément critique à garder à l’esprit pour que cela fonctionne est donc :

Il y a un exemple de cette logique de fallback dans le composant de thème de vignette que j’ai créé — n’hésitez pas à en reprendre la logique.

5 « J'aime »

Le fallback est-il sérialisé sous la forme thumbnailsl[0] ? Oui, je gère déjà cela. (belle implémentation au passage, très facile à gérer)

Est-il possible que certaines images ne « passent pas le test » ou ne répondent pas aux critères ?

Le comportement que nous avons dans le plugin TLP permet de récupérer les vignettes one-box. Cela ne se produit pas dans tous les cas ici, je pense.

Par exemple, si vous avez le temps, jetez un coup d’œil à ces exemples :

Je ne pense pas que ces vignettes soient retenues. Les vignettes sont sérialisées sous la forme null.

Oui, c’est intentionnel. Nous avons reçu plusieurs demandes pour supprimer les petites vignettes des oneboxes. Par exemple, les gens se retrouvaient avec leur avatar GitHub comme vignette de sujet, ce qui est rarement l’intention.

Notez que pour les oneboxes où l’image constitue le contenu réel (comme les photos d’Instagram, Twitter, etc.), elles seront sélectionnées.

En ce qui concerne la vidéo YouTube, j’ai corrigé cela hier.

5 « J'aime »

Ah super, merci pour la confirmation.

C’est étrange, la build était plus récente, mais certains semblent toujours être passés à côté.

Oui, c’est en partie pour cela que j’ai fini par implémenter un sélecteur de miniature pour les situations où le choix automatisé n’était pas optimal. Je pourrais encore vouloir modifier ce comportement, mais je vais essayer de le faire dans le plugin.

Merci pour ton temps, David !

2 « J'aime »

OK, j’ai résolu le problème. Après une session de débogage avec byebug plutôt infructueuse, je n’arrivais pas à comprendre pourquoi les anciennes publications YouTube n’avaient pas de vignettes.

Puis il m’est venu à l’esprit. C’est à cause de ceci :

Je suggère donc qu’il pourrait en fait être nécessaire de régénérer les vignettes après avoir défini cette valeur sur un nombre beaucoup plus élevé (365 ?).

Je pense avoir raison en disant que si quelque chose n’est pas téléchargé localement, aucune vignette ne sera créée ? …

4 « J'aime »

:+1: C’est exact, cela ne fonctionne que pour les téléchargements locaux… nous devrons peut-être repenser ce paramètre « âge maximum en jours » :thinking:

8 « J'aime »

J’ai un plan, je vais essayer de le mettre en œuvre cette semaine. Une question : avez-vous besoin que les valeurs soient dynamiques ?

C’est-à-dire : les résolutions seront-elles définies au démarrage ? Ou à l’exécution (par exemple, via les paramètres du site) ?

Le premier cas est plus simple… mais le second pourrait aussi être possible :thinking:

2 « J'aime »

Merci d’avoir pris le temps de jeter un œil.

J’ai juste besoin d’une solution fixe, exactement comme le composant de thème.

Une configuration du site serait toutefois un plus.

Je précise par souci de transparence : je souhaite migrer loin du plugin, donc une parité avec la solution du composant de thème serait largement suffisante.

2 « J'aime »

@merefield voici :

J’espère que le message du commit explique comment cela fonctionne, mais n’hésite pas à me faire part de tes questions.

7 « J'aime »

Excellent. Je viens de l’ajouter au TLP et cela semble fonctionner ! Merci pour votre aide !

4 « J'aime »

4 messages ont été déplacés vers un nouveau sujet : Obtenir des miniatures à partir de points de terminaison JSON

Pouvons-nous également le faire fonctionner pour les images provenant de serveurs distants ? Par exemple, des images provenant de Blogger, Picasa ou Amazon S3 ?

Étant donné que Discourse prend en charge l’hébergement sur Amazon S3 pour les sites avec de grandes et nombreuses images, si tout doit désormais être hébergé directement sur le serveur local, cette méthodologie de conception semble présenter un inconvénient.

Avec cette mise à jour, ce n’est pas une solution simple pour mon site, car nous utilisons un autre serveur pour héberger les images. Il est désormais trop difficile de migrer vers un serveur affilié compte tenu du grand nombre de publications, tandis que le volume est trop important pour être hébergé sur un serveur local.

Ceci est conçu uniquement pour fonctionner avec les « uploads » de Discourse. Ceux-ci peuvent être stockés sur S3 ou sur un autre service, si vous utilisez

Nous recommandons d’utiliser le paramètre du site download_remote_images pour télécharger automatiquement les images qui sont hotlinkées depuis d’autres sites.

4 « J'aime »

Bonjour David, y a-t-il quelque chose de particulier à faire pour s’assurer que les icônes Pro puissent être utilisées dans un TC ?

1 « J'aime »

Rien de spécial, non. Cela devrait fonctionner exactement comme avec les icônes Pro ailleurs dans Discourse. Je suppose que vous utilisez ce plugin pour activer les icônes Pro ?

Si cela ne fonctionne pas, faites-le-moi savoir et je regarderai :eyes:

2 « J'aime »

Oui, nous le sommes. Nous ferons une nouvelle tentative. Merci pour votre réponse tardive ce soir !

2 « J'aime »