Динамическое обновление доступных значений полей пользователя при заполнении профиля

Я нашел решение для автоматического обновления этого конкретного случая. Возможности обновления через API для опций пользовательских полей нет, я нашел только серверное решение с помощью cron-задачи. Я не использовал JSON-файл, для автоматизации использовал записи в базе данных.

Сценарий использования

Сценарий этой автоматизации заключается в том, чтобы позволить новым пользователям выбирать существующие опции при регистрации, что помогает системе развиваться по мере того, как больше пользователей сообщают о своих предпочтениях. Если новый пользователь не находит подходящую опцию, он может ввести свой текст в поле для пользовательского текста, который затем может быть добавлен в выпадающий список для следующего пользователя.

Используйте это с осторожностью, так как изменения в базе данных Discourse могут привести к сбоям. Рекомендуется только для опытных разработчиков!

Требования:

  • Discourse Data Explorer
  • Discourse установлен через Docker
  • Опыт работы с управлением базами данных

Шаг 1:

Создайте два пользовательских поля в /admin/customize/user_fields: одно с выпадающим списком, а другое — только текстовое (в моем примере: выпадающий список с user_field_5 и текстовое поле с user_field_8).

Примечание: ID можно получить из /admin/customize/user_fields.json.

Шаг 2:

Лучше всего использовать Discourse Data Explorer для проверки ваших вводов: Discourse Data Explorer

Создайте новый запрос в /admin/plugins/explorer:

Например: User Field Options

SELECT * FROM user_field_options WHERE user_field_id='5'

Замените user_field_id=‘5’ на ваш ID выпадающего списка user_field_id=‘x’. Тогда будут выведены значения, отображаемые для ваших опций выпадающего списка.

Создайте второй запрос:

Например: User Custom Fields

SELECT * FROM user_custom_fields WHERE name = 'user_field_8'

Замените ‘user_field_8’ на ваше текстовое пользовательское поле ‘user_field_x’. Тогда будут выведены значения, введенные пользователями в текстовое поле.

Шаг 3: Это основа для вашей cron-задачи по обновлению таблицы user_field_options, где перечислены все опции пользовательских полей, которые имеют для меня связанное значение 5 из-за user_field_5. Я хочу добавить туда опции.

Сначала создайте bash-скрипт в директории для Discourse

cd /var/discourse
nano update_dropdown.sh

Добавьте следующее содержимое, если Discourse запущен в Docker:

#!/bin/bash
cd /var/discourse
docker exec -i app su postgres -c "psql discourse -c \"UPDATE user_custom_fields SET value = (SELECT value FROM user_field_options WHERE user_field_id = 5 AND user_field_options.value = user_custom_fields.value) WHERE name = 'user_field_8' AND value IS NOT NULL AND value NOT IN (SELECT value FROM user_field_options);\""

Убедитесь, что вы сохранили скрипт и сделали его исполняемым

chmod +x update_dropdown.sh

Затем вы можете запустить и протестировать скрипт

cd /var/discourse
./update_dropdown.sh 

Шаг 4: Чтобы автоматизировать это, нам нужно добавить bash-скрипт как cron-задачу:

crontab -e

Это откроет редактор cron-задач, куда вы добавите код в следующей строке:

* * * * * /var/discourse/update_dropdown.sh

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