Cómo enlazar campos personalizados y sincronizar datos del formulario en la página de insignia de admin

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? :anxious_face_with_sweat: ¿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?

1 me gusta

Actualmente no tengo tiempo para investigar este problema ni para recordar cómo lo hice, pero este repositorio debería tener una implementación para extender la funcionalidad de guardado de insignias:

1 me gusta