أحاول فهم كيفية إضافة حقل مخصص إلى المواضيع، وأعمل على مثال بسيط جدًا. الهدف: إضافة حقل مخصص يُسمى “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، ولا أعرف كيف أفعل ذلك.
وإذا كانت هناك طريقة أبسط للقيام بذلك، فسأكون سعيدًا بسماعها!