Я пытаюсь понять, как добавить пользовательское поле к темам, и работаю над очень простым примером. Цель: добавить к каждой создаваемой теме пользовательское поле с именем “sample_field” со значением в виде простой строки.
Я изучил различные примеры, такие как плагин для опросов и плагин “решено”, а также это обсуждение, но эти плагины делают с пользовательскими полями так много всего, что я пока не смог разобраться в базовом коде, который для этого нужен.
Поэтому я еще не добился успеха — в моем файле plugin.rb чего-то не хватает (я думаю), и я еще не понял, как привязать строковое значение к пользовательскому полю в момент создания темы.
Что мне нужно сделать, чтобы это заработало?
Любая помощь будет оценена. Спасибо!
Вот что у меня есть на данный момент:
plugin.rb:
//создаем пользовательское поле:
after_initialize do
Topic.register_custom_field_type('sample_field', :string)
add_to_serializer(:topic_view, :custom_fields) { object.custom_fields } //если я хочу отображать пользовательское поле на стороне клиента
end
assets/javascripts/initializers/topic-custom-field.js.es6:
//инициализируем объект пользовательских полей и делаем так, чтобы его можно было отправить на сервер:
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
});
}
})
})
}
}
Теперь, как добавить значение пользовательского поля к теме в момент её сохранения?
Я полагаю, что ключевое действие “save” для темы происходит здесь в базе кода:
app/templates/composer.hbs:
<div class="save-or-cancel">
{{#unless model.viewFullscreen}}
{{composer-save-button action=(action "save")
icon=saveIcon
label=saveLabel
disableSubmit=disableSubmit}}
...
Как мне выполнить какое-то действие (в данном случае — добавить значение к пользовательскому полю), когда происходит это действие “save”?
Я пробовал создать js-файл в папке initializers, где мог бы сделать что-то вроде:
api.modifyClass('component:composer-save-button', {
actions: {
topic.set('custom_fields.sample_field', 'here's a value for the sample_field')
}
}
Но мне нужно связать этот “topic.set” с действием “save” в composer.hbs, и я не знаю, как это сделать.
И если есть более простой способ сделать это, я с радостью выслушаю ваши предложения!