Estoy escribiendo un plugin para extender la funcionalidad de las insignias. Cuando se presiona el botón “Guardar” en la página de insignias de administración, los campos personalizados siempre tienen el valor predeterminado.
Discourse PluginOutlet
<PluginOutlet
@name="admin-above-badge-buttons"
@outletArgs={{hash badge=this.buffered}}
/>
Mi código 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;
});
},
});
});
},
};
refer from:Having a hard time overriding the save() function on the admin badge page
Después de hacer clic en el botón Guardar. se puede ver en la consola.
![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 // always default value
}
Mi código 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}}
Esta es la salida de la consola
Mi código 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
¿Es normal que ‘@outletArgs.badge’ reciba un valor indefinido?
¿Qué estoy haciendo mal?
¿Cómo puedo vincular campos personalizados y sincronizar los datos del formulario en la página de insignias de administración?
