Ich versuche zu verstehen, wie man ein benutzerdefiniertes Feld zu Themen hinzufügt, und arbeite mich durch ein sehr einfaches Beispiel durch. Ziel: Ein benutzerdefiniertes Feld namens “sample_field” zu jedem erstellten Thema hinzufügen, mit einem einfachen String-Wert.
Ich habe verschiedene Beispiele durchgesehen, wie das Poll-Plugin und das solved-Plugin sowie diese Diskussion, aber diese Plugins machen mit ihren benutzerdefinierten Feldern so viel mehr, dass ich den grundlegenden Code, den man dafür braucht, noch nicht ganz durchschaut habe.
Also bin ich noch nicht so weit – meine Datei plugin.rb fehlt etwas (glaube ich), und ich habe noch nicht herausgefunden, wie man den String-Wert zum Zeitpunkt der Erstellung des Themas an das benutzerdefinierte Feld bindet.
Was muss ich tun, damit das funktioniert?
Jede Hilfe wird geschätzt. Danke!
Hier ist, was ich bisher habe:
plugin.rb:
//Erstelle das benutzerdefinierte Feld:
after_initialize do
Topic.register_custom_field_type('sample_field', :string)
add_to_serializer(:topic_view, :custom_fields) { object.custom_fields } //Wenn ich das benutzerdefinierte Feld auf der Client-Seite anzeigen möchte
end
assets/javascripts/initializers/topic-custom-field.js.es6:
//Initialisiere das benutzerdefinierte Feld-Objekt und stelle sicher, dass es an den Server gesendet werden kann:
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
});
}
})
})
}
}
Wie füge ich dann den Wert des benutzerdefinierten Feldes zum Zeitpunkt des Speicherns zum Thema hinzu?
Ich glaube, die Schlüsselaktion “save” für ein Thema findet hier im Codebase statt:
app/templates/composer.hbs:
<div class="save-or-cancel">
{{#unless model.viewFullscreen}}
{{composer-save-button action=(action "save")
icon=saveIcon
label=saveLabel
disableSubmit=disableSubmit}}
...
Wie mache ich etwas (in diesem Fall einen Wert zum benutzerdefinierten Feld hinzufügen), wenn diese “save”-Aktion auftritt?
Ich habe versucht, eine JS-Datei unter initializers zu erstellen, in der ich etwas wie folgendes tun könnte:
api.modifyClass('component:composer-save-button', {
actions: {
topic.set('custom_fields.sample_field', 'here's a value for the sample_field')
}
}
Aber ich muss in der Lage sein, dieses “topic.set” mit der “save”-Aktion in composer.hbs zu verknüpfen, und ich weiß nicht, wie ich das mache.
Und falls es einen einfacheren Weg gibt, dies zu tun, würde ich mich freuen, davon zu hören!