Estou tentando entender como adicionar um campo personalizado aos tópicos, trabalhando em um exemplo muito básico. Objetivo: Adicionar um campo personalizado chamado “sample_field” a cada tópico criado, com um valor simples do tipo string.
Revisei vários exemplos, como o plugin poll e o plugin solved e esta discussão, mas esses plugins fazem muito mais com seus campos personalizados, e ainda não consegui entender o código básico necessário.
Então, ainda não cheguei lá — meu arquivo plugin.rb está faltando algo (acho que sim), e ainda não descobri como vincular o valor da string ao custom_field no momento em que o tópico é criado.
O que preciso para fazer isso funcionar?
Qualquer ajuda é apreciada. Obrigado!
Aqui está o que tenho:
plugin.rb:
//criar o campo personalizado:
after_initialize do
Topic.register_custom_field_type('sample_field', :string)
add_to_serializer(:topic_view, :custom_fields) { object.custom_fields } //se eu quiser mostrar o campo personalizado no lado do cliente
end
assets/javascripts/initializers/topic-custom-field.js.es6:
//inicializar o objeto custom_fields e permitir que seja enviado para o servidor:
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
});
}
})
})
}
}
Então, como adicionar o valor do campo personalizado ao tópico no momento em que ele é salvo?
Acredito que a ação chave “save” para um tópico ocorre aqui na base de código:
app/templates/composer.hbs:
<div class="save-or-cancel">
{{#unless model.viewFullscreen}}
{{composer-save-button action=(action "save")
icon=saveIcon
label=saveLabel
disableSubmit=disableSubmit}}
...
Como faço algo (neste caso, adicionar um valor ao campo personalizado) quando essa ação “save” ocorre?
Tentei criar um arquivo JS em initializers, onde poderia fazer algo como:
api.modifyClass('component:composer-save-button', {
actions: {
topic.set('custom_fields.sample_field', 'aqui está um valor para o sample_field')
}
}
Mas preciso conseguir vincular esse “topic.set” à ação “save” em composer.hbs, e não sei como fazer isso.
E se houver uma maneira mais simples de fazer isso, ficarei feliz em ouvir!