So binden Sie benutzerdefinierte Felder und synchronisieren Sie Formular Daten auf der Admin Badge Seite

Ich schreibe ein Plugin, um die Abzeichenfunktionalität zu erweitern. Wenn die Schaltfläche „Speichern“ auf der Admin-Abzeichenseite gedrückt wird, haben die benutzerdefinierten Felder immer den Standardwert.

Discourse PluginOutlet

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

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

Referenz von: Having a hard time overriding the save() function on the admin badge page

Nachdem ich auf die Schaltfläche „Speichern“ klicke, kann ich es in der Konsole sehen.
![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
}

Mein 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}}

Dies ist die Konsolenausgabe

Mein 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

Ist es normal, dass @outletArgs.badge einen undefinierten Wert erhält? :anxious_face_with_sweat: Was mache ich falsch?
Wie kann ich benutzerdefinierte Felder binden und Formulardaten auf der Admin-Abzeichenseite synchronisieren?

1 „Gefällt mir“

Ich habe im Moment keine Zeit, mich mit diesem Problem zu befassen oder mich daran zu erinnern, wie ich es gemacht habe, aber dieses Repository sollte eine Implementierung zur Erweiterung der Badge-Speicherfunktionalität enthalten:

1 „Gefällt mir“