J’essaie de comprendre comment ajouter un champ personnalisé aux sujets et je travaille sur un exemple très basique. Objectif : Ajouter un champ personnalisé nommé “sample_field” à chaque sujet créé, avec une valeur de type chaîne simple.
J’ai examiné divers exemples, comme le plugin poll, le plugin solved et cette discussion, mais ces plugins font beaucoup plus avec leurs champs personnalisés, ce qui m’a empêché de comprendre le code de base nécessaire.
Donc, je n’y suis pas encore tout à fait : mon fichier plugin.rb manque quelque chose (je pense), et je n’ai pas encore trouvé comment lier la valeur de la chaîne au champ personnalisé au moment de la création du sujet.
Que dois-je faire pour que cela fonctionne ?
Toute aide est appréciée. Merci !
Voici ce que j’ai jusqu’à présent
plugin.rb :
//Créer le champ personnalisé :
after_initialize do
Topic.register_custom_field_type('sample_field', :string)
add_to_serializer(:topic_view, :custom_fields) { object.custom_fields } //si je veux afficher le champ personnalisé côté client
end
assets/javascripts/initializers/topic-custom-field.js.es6 :
//Initialiser l’objet des champs personnalisés et permettre son envoi au serveur :
import { withPluginApi } from 'discourse/lib/plugin-api';
export default {
name: 'topic-custom-field',
initialize() {
withPluginApi('0.8.31', api => {
api.modifyClass('model:topic', {
custom_fields: {},
asJSON() {
return Object.assign(this._super(), {
custom_fields: this.custom_fields
});
}
})
})
}
}
Ensuite, comment ajouter la valeur du champ personnalisé au sujet au moment de l’enregistrement ?
Je pense que l’action clé “save” pour un sujet se produit ici dans la base de code :
app/templates/composer.hbs :
<div class="save-or-cancel">
{{#unless model.viewFullscreen}}
{{composer-save-button action=(action "save")
icon=saveIcon
label=saveLabel
disableSubmit=disableSubmit}}
...
Comment puis-je faire quelque chose (dans ce cas, ajouter une valeur au champ personnalisé) lorsque cette action “save” se produit ?
J’ai essayé de créer un fichier JS sous initializers, où je pourrais faire quelque chose comme :
api.modifyClass('component:composer-save-button', {
actions: {
topic.set('custom_fields.sample_field', 'voici une valeur pour le sample_field')
}
}
Mais je dois pouvoir lier ce “topic.set” à l’action “save” dans composer.hbs, et je ne sais pas comment faire.
Et s’il existe un moyen plus simple de faire cela, je suis heureux de l’entendre !