トピックにカスタムフィールドを追加する方法を理解しようとしており、非常に基本的な例に取り組んでいます。目標は、各作成されたトピックに「sample_field」という名前のカスタムフィールドを追加し、単純な文字列値を持たせることです。
いくつかの例を確認しました。例えばpoll pluginやsolved plugin、そしてこのディスカッションなどです。しかし、これらのプラグインはカスタムフィールドに対して非常に多くのことを行っているため、必要な基本的なコードがまだよくわかりません。
そのため、まだ完璧ではありません。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」アクションが発生したときに、何か(この場合はカスタムフィールドに値を追加する)を行うにはどうすればよいでしょうか?
initializers以下にjsファイルを作成し、以下のような処理を試みました。
api.modifyClass('component:composer-save-button', {
actions: {
topic.set('custom_fields.sample_field', 'here's a value for the sample_field')
}
}
しかし、その「topic.set」をcomposer.hbsの「save」アクションにリンクさせる必要があり、その方法がわかりません。
もしより簡単な方法があれば、ぜひ教えてください!