Getting user profile custom field via JS

Hi,

I’m wondering if it is possible to retrieve user profile custom fields in our customized header using something like this:

$.ajax("/session/current").then(function (json) { 
    console.log(json.custom.user_field_4);
}

What would be the correct syntax?
Thanks!

1 лайк

You want something like

$.ajax("/session/current").then(function(result) {
  console.log(result.current_user.custom_fields);
});
2 лайка

Thanks, how do I get to the attribute?
console.log(result.current_user.custom_fields); yields an object,
i also tried:
result.current_user.custom_fields.my_field_name
and
result.current_user.custom_fields.user_field_4
they all return “undefined”

2 лайка

You will need to whitelist the custom fields you want using the “public_user_custom_fields” site setting.

3 лайка

got it thanks! :smile:

3 лайка

Is this still accurate? I’ve added pro_expires_at as a custom field on my user (User.find('nuck').tap { |u| u.custom_fields['pro_expires_at'] = 5.weeks.from_now.to_i }.save) and stuffed that into public_user_custom_fields in the site settings panel, but I’m just not seeing it in the preload data?

2 лайка

It definitely should still be working. We haven’t removed it and some plugins rely on it to work.

What preload info are you looking at? Viewing a user’s profile?

currentUser and the custom_user_fields attribute that the PostSerializer says should be present on serialized Post objects

It should definitely work if it’s public_user_custom_fields – I know we’re using this feature on some plugins and the data is indeed being displayed properly. Maybe try restarting your dev server? Does it appear in the JSON request?

2 лайка

If you want a custom_user_field on the post object you can do this:

1 лайк

public_user_custom_fields in the admin panel, right? Not some setting elsewhere?

I was actually developing against our staging server which rebuilds the docker every time so I’m certain it was restarted (and then some). I’ll look at the JSON request this weekend and see if I can pin this down.

Wouldn’t this cause an N+1 query? Is there any solid documentation on the whole custom field system somewhere? I didn’t realize you could register the custom field type or append to serialized_current_user_fields

I don’t think so, because the serializer already has the user object, is just a matter of including it in the payload. I can be wrong, tough.

Nope, but there are plenty of opensource plugins and the Discourse source code itself.

I found it trough other plugins code too.

Right, public_user_custom_fields in the admin panel. Those fields should end up in the JSON request. I’d double check there. Without a development environment your life is going to be a lot harder, as the next step would be to go into the code and add Rails.logger.info to try and figure out why those fields are not being passed through when they should.

1 лайк

По какой-то причине я не вижу пользовательские поля в консоли, которые я добавил в разделе Администрирование > Настройка > Пользовательские поля.

В плагине я добавил следующее:

<script type="text/discourse-plugin" version="0.8.42">
   const user = api.getCurrentUser();
   console.log(user);
</script>

При просмотре объекта user я вижу пустой объект в поле custom_fields. Когда я меняю код на console.log(user.custom_fields);, он всё ещё показывает пустой объект.

У текущего пользователя заполнены три пользовательских поля. Я добавил ключи всех трёх полей в формате test_topic в разделы «Публичные пользовательские поля» и «Поля для сотрудников», но объект в консоли всё равно отображается пустым.

Я обращался к ChatGPT (ха-ха), но это не помогло.

Есть ли какие-либо предложения, что может происходить?

ОБНОВЛЕНИЕ: Я думаю, одна проблема заключалась в том, что я использовал custom_fields, а теперь, судя по всему, данные находятся под меткой user_fields, как указано здесь:

Однако это показывает мне только значение пользовательского поля и число в качестве ключа, а не тот пользовательский ключ, который я ввёл в разделе Администрирование > Настройка > Пользовательские поля.

1 лайк

Этот компонент темы может вас заинтересовать в зависимости от того, что вы планируете делать с полем пользователя.

Этот плагин позволяет скрывать сообщения по ключевым словам, за которыми следит пользователь.

Просмотр исходного кода может дать идеи.

1 лайк

Я в основном пытаюсь создать небольшой компонент темы, который обеспечит следующее для пользовательских полей, которые я добавляю в разделе администрирования > Настройка > Пользовательские поля:

  1. Их включение в переводимые i18n, чтобы я мог настраивать их текст в разделе администрирования > Настройка > Тексты.
  2. Их добавление в качестве ключей интерполяции, чтобы я мог использовать их как %{key} в разделе администрирования > Настройка > Тексты.

По сути, я пытаюсь решить свою собственную проблему, которую я опубликовал здесь:
https://meta.discourse.org/t/create-and-configure-custom-user-fields/113192/55

Но я не смог пройти дальше первого этапа — получения комбинации ключ/значение из пользовательских полей в объекте пользователя.

Я изучу то, что вы добавили, спасибо!

1 лайк

Я всё ещё новичок и учусь по ходу дела. Я не могу сказать наверняка, но для языковых переводов есть два плагина, которые выполняют переводы.

И

Приношу извинения, если я неправильно понял, чего вы пытаетесь достичь.

1 лайк