Comment lier des champs personnalisés et synchroniser les données du formulaire sur la page badge admin

Je développe un plugin pour étendre les fonctionnalités des badges. Lorsque le bouton « Enregistrer » est enfoncé sur la page d’administration des badges, les champs personnalisés prennent toujours la valeur par défaut.

Discourse PluginOutlet

    <PluginOutlet
      @name="admin-above-badge-buttons"
      @outletArgs={{hash badge=this.buffered}}
    />

Mon code 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;
          });
        },
      });
    });
  },
};

référé de :Having a hard time overriding the save() function on the admin badge page

Après avoir cliqué sur le bouton Enregistrer. On peut le voir dans la console.
![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
}

Mon code 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}}

Ceci est la sortie de la console

Mon code 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

Est-il normal que @outletArgs.badge obtienne une valeur indéfinie ? :anxious_face_with_sweat: Qu’est-ce que je fais de mal ?
Comment puis-je lier les champs personnalisés et synchroniser les données du formulaire sur la page d’administration des badges ?

1 « J'aime »

Je n’ai pas le temps de me pencher sur ce problème actuellement ni de me souvenir comment je l’ai fait, mais ce dépôt devrait contenir une implémentation de l’extension de la fonctionnalité de sauvegarde des badges

1 « J'aime »