Pour stocker les données personnalisées sur Discourse, je suis allé dans Admin > Personnaliser > Champs utilisateur et j’ai créé un champ personnalisé. Les données dont j’ai besoin sont un percentile représentant l’avancement, et j’ai choisi « texte » comme type de champ. Le nom du champ n’est affiché que sur la carte de l’utilisateur et sur son profil, et malheureusement, il n’est pas utilisé pour référencer les données du champ de manière programmatique.
Le champ stockant l’avancement était le troisième champ personnalisé que j’ai créé, et ainsi « 3 » devient un nombre très important.
En utilisant l’API, j’ai écrit un script curl (avec l’aide de https://meta.discourse.org/t/api-cannot-update-user/63876/4) pour remplir le champ avec des données de test. Comme le champ que je voulais remplir était le troisième que j’avais créé, ma ligne de données dans le script curl est :
--data '{ "user_fields": { "3":"87" } }'
Pour afficher les données, il a fallu aller dans Admin > Paramètres > Utilisateurs, faire défiler jusqu’à l’option « champs personnalisés publics des utilisateurs » et ajouter le champ à la liste blanche. Comme le champ était le troisième créé, j’ai dû ajouter « user_field_3 » à la liste blanche et non le nom réel que j’avais donné au champ.
À ce stade, j’ai écrit un plugin basique avec le code suivant :
import { withPluginApi } from 'discourse/lib/plugin-api';
export default {
name: 'progress-indicator',
initialize() {
withPluginApi("0.8.23", api => {
api.decorateWidget('post-avatar:after', helper => {
let progress = helper.attrs.userCustomFields['user_field_3'];
let retString = helper.h("div.progress-wrapper",
{style: 'border: 1px solid blue; width:100%;'},
helper.h('div.progress-bar',{style: 'width:'+progress+'%; background-color: green; height: 10px;'})
);
return retString;
});
});
}
};
Le résultat final
