Добавить пользовательское поле на страницу аккаунта

Кто-то хочет добавить пользовательские поля на страницу аккаунта (по каким-то причинам им не нравится страница профиля).

Кажется, я должен быть в состоянии сделать это в компоненте темы.

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/templates/preferences/account.hbs#L207

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/templates/preferences/profile.hbs#L24-L28

common/head_tag.html:

<script type="text/x-handlebars" data-template-name="/connectors/user-preferences-account/lc-ucf">
<div style="height: 25px; width: 25px;background: blue"></div>
<h3>Пользовательские поля для {{ model.username}}</h3>
Это uf: {{model.user_fields}}.
{{log "THIS" model.user_fields}}
{{#each model.user_fields |uf|}}
{{log "THISTHISTHIS" this}}
  <div class="control-group">
    {{user-field field=uf.field value=value}}
  </div>
{{/each}}
<div class='clearfix'></div>
</script>

Однако мне не удаётся получить доступ к пользовательским полям пользователя.

Я вижу свой синий квадрат.

Я вижу, что могу получить доступ к model.username.

В логе консоли я вижу:

THIS {3: "STEM Professional (industry)"}

Я уверен, что делаю что-то глупое, но после многократного чтения отличного Руководства разработчика по темам я в тупике.

Что ж, я снова делаю то же самое — пишу о проблеме, которую пытаюсь решить..

Теперь я пытаюсь решить ту же проблему в виде плагина. Я создал файл myplugin/assets/javascripts/discourse/connectors/preferences/account/user-custom-controls/my-stuff.hbs, и он добавил кое-что на страницу (точно так же, как и раньше!). И снова я не знаю, как (1) получить данные и (2) сообщить Ember (?), что поле должно обновляться при сохранении формы.

Теперь мне кажется, что, возможно, мне нужно переопределить или дополнить account.js.es6 и добавить user_fields в this.saveAttrNames, чтобы система знала, что их нужно сохранять при обновлении, а также загружать данные в userFields.

Я просмотрел множество плагинов, но так и не смог разобраться.

Хорошо, мне удалось заставить это работать, но это немного непросто.

Создайте класс коннектора с этим кодом.

import { set } from "@ember/object";
import EmberObject from "@ember/object";

export default {
@discourseComputed("model.user_fields.@each.value")
  publicUserFields() {
    const siteUserFields = this.site.get("user_fields");
    if (!isEmpty(siteUserFields)) {
      const userFields = this.get("model.user_fields");
      return siteUserFields
        .filterBy("show_on_user_card", true)
        .sortBy("position")
        .map(field => {
          set(field, "dasherized_name", field.get("name").dasherize());
          const value = userFields ? userFields[field.get("id")] : null;
          return isEmpty(value) ? null : EmberObject.create({ value, field });
        })
        .compact();
    }
  },
}

В шаблоне коннектора:

{{#if publicUserFields}}
        <div class="card-row fifth-row">
          <div class="public-user-fields">
            {{#each publicUserFields as |uf|}}
              {{#if uf.value}}
                <div class="public-user-field {{uf.field.dasherized_name}}">
                  <span class="user-field-name">{{uf.field.name}}:</span>
                  <span class="user-field-value">{{uf.value}}</span>
                </div>
              {{/if}}
            {{/each}}
          </div>
        </div>
{{/if}}

@pfaffman сработало?

У меня пока не было возможности это попробовать, но, думаю, оно сработает. Столько всего мне ещё предстоит узнать. Огромное спасибо за вашу щедрость! Я не могу выразить вам достаточно слов благодарности, но постараюсь сделать это позже, когда сам всё попробую.