# Quelle est la "difficulté" de modifier/étendre Discourse pour un développeur backend ?

**URL:** https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037
**Category:** Development
**Created:** [Novembre 30, 2023, 6:52 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037 "2023-11-30T06:52:39Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![BSODjunkie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bsodjunkie/32/344808_2.png) [@BSODjunkie](https://meta.discourse.org/u/BSODjunkie)
#### Post date: [Novembre 30, 2023, 6:52 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/1 "2023-11-30T06:52:39Z")

</div>

Salut,

Je suis un ingénieur en apprentissage automatique (MLE) avec une certaine expérience en backend. Mes compétences en frontend sont inexistantes/très faibles.

Je souhaite héberger un petit forum qui nécessite les fonctionnalités suivantes :

- Filtrer les publications par plusieurs balises de manière simple
- Certaines catégories masquées sauf si l’utilisateur est connecté
- Inscriptions nécessitant une approbation par l’administrateur
- Potentiellement un carrousel de photos en haut du site

Ce type de choses est-il difficile à réaliser ? J’ai examiné le code de certains plugins et bien que l’implémentation réelle soit assez courte et simple à lire, elle semble difficile à écrire.

---

<div class="post-metadata">

### Author: ![SinisterSpatula](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sinisterspatula/32/332339_2.png) [@SinisterSpatula](https://meta.discourse.org/u/SinisterSpatula)
#### Post date: [Novembre 30, 2023, 7:12 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/2 "2023-11-30T07:12:00Z")

</div>

Je suis dans la même situation que vous. J’ai de l’expérience avec le backend nodejs. J’ai aussi fait un peu de html/css/javascript en frontend, mais j’ai fait beaucoup plus de backend. Il y a beaucoup de ce qui semble être du code spécialisé propre à Discourse ou Ruby, ou un style de codage très opinionné. Même si je connais JavaScript, la base de code de Discourse me semble intimidante et complexe. Je pense sérieusement à essayer de faire tourner ma propre IA locale dans laquelle je pourrais injecter toute la base de code et lui poser des questions sur ce que je veux faire. Sinon, tout ce que je peux faire, c’est lire le code existant, les plugins, etc., et essayer de le comprendre au mieux. Si vous êtes intéressé par le partage de connaissances ou par l’apprentissage ensemble, je suis ouvert à cela 🙂

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [Novembre 30, 2023, 7:18 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/3 "2023-11-30T07:18:30Z")

</div>

Oui, il y a une courbe d’apprentissage assez importante. Mais toutes les choses que vous mentionnez existent déjà et aucun codage ne sera nécessaire.

> [@BSODjunkie](#):
>
> - Certaines catégories étant masquées sauf si l’utilisateur est connecté
> - Inscriptions nécessitant une approbation par l’administrateur

sont dans le cœur de Discourse, et

> [@BSODjunkie](#):
>
> - Filtrer les publications par plusieurs balises de manière simple
> - Carrousel de photos en haut du site potentiellement

peuvent être réalisés avec des composants de thème existants.

---

<div class="post-metadata">

### Author: ![SinisterSpatula](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sinisterspatula/32/332339_2.png) [@SinisterSpatula](https://meta.discourse.org/u/SinisterSpatula)
#### Post date: [Novembre 30, 2023, 7:43 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/4 "2023-11-30T07:43:30Z")

</div>

Je donnerais N’IMPORTE QUOI pour avoir des cours vidéo sur le développement de discourse sur Udemy. Dites-moi juste à qui envoyer de l’argent. 💵💵💵

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Novembre 30, 2023, 12:51 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/5 "2023-11-30T12:51:13Z")

</div>

> [@BSODjunkie](#):
>
> Filtrer les publications par plusieurs balises de manière simple

Pas besoin de bricoler pour cela, c’est déjà pris en charge par l’API. Et vous pouvez déjà le faire depuis le front-end ! J’ai créé un « widget » (Composant Glimmer !) juste pour cela ! :

> [@Render a component within a Widget. (Using select-kit components within plugin code)](https://meta.discourse.org/t/render-a-component-within-a-widget-using-select-kit-components-within-plugin-code/84462/31?u=merefield):
>
> This is now a thing, albeit slightly roughly finished atm: [image] Requires the [Layouts Plugin](https://meta.discourse.org/t/layouts-plugin/55208). Repo of Theme Component here: [GitHub - paviliondev/layouts-tag-intersection-widget: A small widget to allow you to navigate to a topic list based on a combinations of tags](https://github.com/paviliondev/layouts-tag-intersection-widget)

Ce composant fonctionne dans les blocs et les mises en page de la barre latérale droite.

---

<div class="post-metadata">

### Author: ![BSODjunkie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bsodjunkie/32/344808_2.png) [@BSODjunkie](https://meta.discourse.org/u/BSODjunkie)
#### Post date: [Novembre 30, 2023, 1:17 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/6 "2023-11-30T13:17:53Z")

</div>

Cela pourrait-il être utilisé pour créer une hiérarchie imbriquée.

Le forum que j’envisage s’adresse à des personnes âgées qui n’ont jamais vu de discussions comme celles des forums.

Il serait agréable pour eux de pouvoir toujours naviguer dans des structures imbriquées comme les forums traditionnels.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [Novembre 30, 2023, 1:19 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/7 "2023-11-30T13:19:22Z")

</div>

Pour l’imbrication, utilisez Categories.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [Novembre 30, 2023, 8:16 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/8 "2023-11-30T20:16:20Z")

</div>

> [@BSODjunkie](#):
>
> Cela pourrait-il être utilisé pour créer une hiérarchie imbriquée ?
> 
> Le forum que j’envisage s’adresse à des personnes âgées qui n’ont jamais vu de discussions comme les forums auparavant.
> 
> Ce serait bien pour eux de pouvoir toujours naviguer dans des structures imbriquées comme les forums traditionnels.

De nombreuses instances de Discourse optent pour cela, voir :

> **[Cardano Forum](https://forum.cardano.org/)**
>
> A place for discussing everything about Cardano

> **[Funcom Forums](https://forums.funcom.com/)**
>
> Welcome to the Funcom Community Forums!

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [Décembre 1, 2023, 12:32 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/9 "2023-12-01T00:32:52Z")

</div>

Hors sujet, mais c’était tellement pratique ici, j’adore notre fonctionnalité “expliquer avec l’IA”

> `un MLE` dans le contexte donné fait référence à un ingénieur en apprentissage automatique (Machine Learning Engineer). C’est un professionnel qui se spécialise dans l’utilisation de données et d’algorithmes pour construire des modèles qui permettent aux machines d’effectuer des tâches sans être explicitement programmées pour ces tâches spécifiques. Ils ont généralement une solide formation en informatique, en statistiques et en programmation, et leur expertise tend à se concentrer sur les aspects backend de la technologie, tels que la construction et le déploiement de modèles prédictifs et d’autres produits d’apprentissage automatique. Lorsque l’auteur original mentionne “un MLE”, il s’identifie comme un ingénieur en apprentissage automatique qui connaît le développement backend mais qui manque d’expérience en développement frontend.

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [Décembre 1, 2023, 12:37 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/10 "2023-12-01T00:37:13Z")

</div>

> [@BSODjunkie](#):
>
> J’ai examiné le code de certains plugins et bien que l’implémentation réelle soit assez courte et simple à lire, elle semble difficile à écrire.

> [@SinisterSpatula](#):
>
> Je tuerais pour quelques cours vidéo sur le développement de Discourse sur Udemy.

Quelques réflexions à ce sujet.

### Développement de cours payants sur Discourse

L’idée de cours liés au développement de Discourse sur une plateforme comme Udemy ou Coursera est intéressante. Je soupçonne que les principaux problèmes sont qu’il n’y a pas beaucoup de personnes en dehors de l’équipe Discourse qui seraient qualifiées pour créer un cours sur le développement de Discourse et que le nombre potentiel d’étudiants pour un cours est assez faible. Cela dit, je suis sûr qu’un bon cours lié au développement de thèmes ou de plugins Discourse pourrait attirer suffisamment d’étudiants au fil du temps pour justifier l’effort de création d’un cours.

Il y a aussi un problème potentiel : facturer des cours sur Discourse pourrait aller à l’encontre de l’esprit de ce forum. Je ne fais que spéculer à ce sujet cependant.

### Tutoriels de développement Discourse

Je pense que l’observation selon laquelle l’implémentation réelle de nombreux plugins, thèmes et composants de thème Discourse est assez simple est correcte. Comme pour le développement pour d’autres plateformes, le problème est de dépasser la barrière initiale de ne pas comprendre comment les pièces s’assemblent. L’équipe Discourse (ou d’autres développeurs qualifiés) pourrait aider à cela en rédigeant quelques tutoriels qui vous guident tout au long du processus de création de thèmes, de composants de thème et de plugins fonctionnels. Par exemple, un guide étape par étape pour créer quelque chose comme le composant de thème Discourse Placeholder.

Je réalise que cela nécessiterait un investissement de temps important, il faudrait donc qu’il corresponde aux objectifs commerciaux de Discourse.

### Ressources actuellement disponibles

Avec un peu de recherche, il existe de nombreuses bonnes informations sur le développement de Discourse sur ce forum. Examiner des exemples de code du dépôt GitHub de Discourse est également un excellent moyen d’apprendre.

Un outil récent à ne pas négliger est GitHub Copilot. Si vous structurez votre environnement de développement de la bonne manière, il peut être utile pour avoir une idée de la façon de développer des thèmes et des plugins Discourse. Pour le développement de thèmes Discourse, la meilleure approche que j’ai trouvée est de développer le thème (en utilisant le [Discourse Theme CLI](https://meta.discourse.org/t/install-the-discourse-theme-cli-console-app-to-help-you-build-themes/82950)) dans le répertoire racine de mon installation locale de Discourse. Structurer les choses de cette façon donne à Copilot un accès facile à la base de code de Discourse. (Notez que pour le développement de plugins, le dossier `plugins` se trouve déjà dans le répertoire racine `/discourse`.) (Notez également que je pourrais avoir tort quant à l’accès réel de Copilot à la base de code de Discourse que j’ai chargée dans mon IDE. Dans tous les cas, il est utile d’avoir le code de base de Discourse disponible pour ma propre référence.)

Pour éviter les distractions et aussi pour me concentrer sur l’utilisation de Copilot comme outil d’apprentissage, je désactive les complétions Copilot dans mon IDE (VS Code) et j’interagis avec Copilot via le chat. Voici un exemple du type d’assistance qu’il peut fournir. (`shopify.js` est le fichier créé par le Theme CLI dans le répertoire `/javascripts/discourse/api-initializers/` de mon thème.)

> **Conversation avec Copilot**
>
> \_scossar : Pouvez-vous expliquer ce que fait l’exportation par défaut dans `shopify.js` ? C’est essentiellement le code de base fourni par Discourse lorsqu’un thème est créé avec la gem `discourse_theme`. J’ai modifié le code de base de manière à ce qu’il enregistre chaque changement de page. Je comprends l’appel à `api.onPageChange`, mais je ne comprends pas clairement comment l’objet `api` est injecté dans mon code.
> 
> > GitHub Copilot : L’objet `api` est injecté dans votre code via la fonction `withPluginApi` qui est appelée dans la méthode `initialize` de l’objet retourné par `apiInitializer`.
> 
> > Voici une version simplifiée de ce qui se passe :
> 
> > 1. Lorsque Discourse démarre, il exécute tous les initialisateurs.
> 
> > 1. La fonction `apiInitializer` crée un initialisateur qui s’exécute après l’initialisateur `"inject-objects"`.
> 
> > 1. Lorsque cet initialisateur s’exécute, il appelle la fonction `withPluginApi` en passant les paramètres `version`, `cb` et `opts`.
> 
> > 1. La fonction `withPluginApi` vérifie si la version actuelle de Discourse est compatible avec la version spécifiée. Si c’est le cas, elle appelle la fonction de rappel (`cb`) et passe l’instance `PluginApi` comme argument. Cette instance `PluginApi` est l’objet `api` que vous voyez dans votre code.
> 
> > Ainsi, l’objet `api` est une instance de `PluginApi`, et il vous est passé par la fonction `withPluginApi`. Cet objet fournit un certain nombre de méthodes qui vous permettent d’interagir avec Discourse, telles que `onPageChange`, que vous utilisez déjà.
> 
> \_scossar : Donc, la fonction qui est le deuxième argument de l’exportation par défaut dans `shopify.js` est la fonction de rappel acceptée par `apiInitializer` ?
> 
> > GitHub Copilot : Oui, c’est exact. Le deuxième argument de `apiInitializer` est une fonction de rappel. Cette fonction est appelée avec l’instance `PluginApi` comme argument lorsque l’initialisateur s’exécute (en supposant que la version actuelle de Discourse soit compatible avec la version spécifiée). C’est ainsi que l’objet `api` est rendu disponible dans votre fichier `shopify.js`.
> 
> Une fois que j’ai compris cela…
> 
> \_scossar : …Une autre idée, `api.decorateCooked` pourrait-il être utilisé pour injecter un iframe de notation hébergé sur une application externe (par exemple, hébergé par l’application Shopify que je développe) ?
> 
> > GitHub Copilot : Oui, vous pouvez utiliser `api.decorateCooked` pour injecter un iframe dans un post. Voici un exemple approximatif de la façon dont vous pourriez le faire :
> 
> > ```javascript
> > api.decorateCooked($elem => {
> > const postId = $elem.data('post-id');
> > const iframe = document.createElement('iframe');
> > iframe.src = `https://your-app.com/ratings?post_id=${postId}`;
> > iframe.width = '100%';
> > iframe.height = '200'; // ajustez au besoin
> > $elem.append(iframe);
> > }, { id: 'rating-iframe' });
> > 
> > ```
> 
> > Dans cet exemple, `api.decorateCooked` est utilisé pour ajouter un iframe à chaque post. La source de l’iframe est définie sur une URL de votre application externe, avec l’ID du post inclus comme paramètre de requête. Vous remplaceriez `'https://your-app.com/ratings'` par l’URL réelle de votre page de notation.
> 
> > Veuillez noter qu’il s’agit d’un exemple simplifié. Vous devrez peut-être l’adapter à vos besoins, et vous devriez absolument ajouter une gestion des erreurs et d’autres précautions nécessaires pour garantir son bon fonctionnement et sa sécurité.

Il n’est pas raisonnable à ce stade d’attendre de Copilot qu’il écrive tout votre code, mais c’est un excellent outil pour apprendre à écrire du code Discourse.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [Décembre 1, 2023, 12:52 UTC](https://meta.discourse.org/t/how-difficult-is-modifying-extending-discourse-for-a-backend-dev/287037/11 "2023-12-01T00:52:21Z")

</div>

Je penserais qu’avoir moins de catégories et moins de hiérarchie serait plus facile pour les personnes âgées.

À moins que vous n’ayez beaucoup de trafic qui intéresse très peu de monde, vous n’avez probablement pas besoin de beaucoup de catégories.
