Ajouter un champ personnalisé utilisateur sur la page du compte utilisateur

Quelqu’un souhaite des champs personnalisés pour les utilisateurs sur la page du compte (pour des raisons qui les poussent à ne pas aimer la page de profil).

Il semble que je devrais pouvoir réaliser cela via un composant de thème.

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>Champs personnalisés pour {{ model.username}}</h3>
Voici les champs personnalisés : {{model.user_fields}}.
{{log "CECI" model.user_fields}}
{{#each model.user_fields |uf|}}
{{log "CECIETENCORE" this}}
  <div class="control-group">
    {{user-field field=uf.field value=value}}
  </div>
{{/each}}
<div class='clearfix'></div>
</script>

Je n’arrive pas à accéder aux champs personnalisés de l’utilisateur, cependant.

Je vois ma boîte bleue.

Je constate que je peux accéder à model.username.

Dans la console, j’observe :

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

Je suis certain de faire une bêtise, mais après avoir lu à plusieurs reprises l’excellente Guide du développeur pour les thèmes, je suis bloqué.

Eh bien, je refais encore la chose où je poste sur un problème que j’essaie de résoudre…

Maintenant, j’essaie de résoudre le même problème dans un plugin. J’ai créé myplugin/assets/javascripts/discourse/connectors/preferences/account/user-custom-controls/my-stuff.hbs et cela a ajouté du contenu à la page (comme avant !), et encore une fois, je ne sais pas comment (1) récupérer les données, (2) dire à Ember (?) qu’il doit mettre à jour le champ lorsque le formulaire est enregistré.

Je pense maintenant que je dois peut-être remplacer ou ajouter à account.js.es6 et ajouter les user_fields à this.saveAttrNames afin qu’il sache les enregistrer s’ils sont mis à jour, et aussi récupérer les données dans userFields.

J’ai fouillé dans pas mal de plugins, mais je n’arrive pas tout à fait à y parvenir.

D’accord, j’ai réussi à faire fonctionner, mais c’est un peu délicat.

Créez une classe de connecteur avec ce code.

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

Dans le modèle du connecteur,

{{#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 est-ce que ça a fonctionné ?

Je n’ai pas encore eu l’occasion de l’essayer, mais je suppose que ce sera le cas. Il y a tant de choses que je dois encore apprendre. Merci infiniment pour votre générosité ! Je ne saurais assez vous remercier, mais je le ferai quand j’aurai l’occasion de l’essayer.