我正在编写一个插件来扩展徽章功能。当管理员徽章页面上的“保存”按钮被按下时,自定义字段始终是默认值。
Discourse PluginOutlet
<PluginOutlet
@name="admin-above-badge-buttons"
@outletArgs={{hash badge=this.buffered}}
/>
我的代码 assets\javascripts\discourse\initializers\badge-avatar-frame-setup.js:
import { withPluginApi } from "discourse/lib/plugin-api";
import { ajax } from "discourse/lib/ajax";
export default {
name: "badge-avatar-frame-setup",
initialize() {
withPluginApi("0.8.31", (api) => {
api.modifyClass("model:badge", {
pluginId: "discourse-badge-avatar-frame",
pluginProperties: ["avatar_frame_enabled"],
save(data = {}) {
this.pluginProperties.forEach((prop) => {
if (this[prop] !== undefined) {
data[prop] = this[prop];
}
});
console.log("Saving badge with data:", data);
console.log("Saving badge:", this);
console.log("avatar_frame_enabled:", this.avatar_frame_enabled);
console.log("data:", data);
let url = "/admin/badges",
type = "POST";
if (this.id) {
url += `/${this.id}`;
type = "PUT";
}
return ajax(url, { type, data }).then((json) => {
this.updateFromJson(json);
return this;
});
},
});
});
},
};
参考自:Having a hard time overriding the save() function on the admin badge page
点击保存按钮后,可以在控制台中看到。
![admin badge page after click the save button|690x464]
data:{
"allow_title": true,
"multiple_grant": false,
"listable": true,
"auto_revoke": true,
"enabled": true,
"show_posts": false,
"target_posts": false,
"name": "新しいバッジ",
"description": "",
"long_description": "",
"icon": "angle-left",
"image_upload_id": null,
"image_url": null,
"query": null,
"badge_grouping_id": 6,
"trigger": 0,
"badge_type_id": 1,
"show_in_post_header": false,
"avatar_frame_enabled": false // 始终是默认值
}
我的代码 assets\javascripts\discourse\connectors\admin-above-badge-buttons\badge-avatar-frame-settings.hbs:
{{#if this.siteSettings.avatar_frame_enabled}}
<div class="badge-avatar-frame-settings">
<h3>{{i18n "admin.badges.avatar_frame_settings"}}</h3>
<div class="control-group">
<label class="checkbox-label">
<Input @type="checkbox" @checked={{this.avatar_frame_enabled}} />
{{i18n "admin.badges.avatar_frame_enabled"}}
+
{{log @outletArgs.badge}}
{{log @outletArgs}}
</label>
</div>
</div>
{{/if}}
这是控制台输出:
我的代码 db\migrate\20250509000000_add_avatar_fields_to_badges.rb:
class AddAvatarFieldsToBadges < ActiveRecord::Migration[6.1]
def change
add_column :badges, :avatar_frame_enabled, :boolean, default: false, null: false
end
end
@outletArgs.badge 获取未定义值是否正常?
我哪里做错了?
如何绑定自定义字段并在管理员徽章页面同步表单数据?
