프로필 작성 중 사용 가능한 사용자 필드 값을 동적으로 업데이트

@JammyDodger님과 @Canapin님께 빠른 답변 주셔서 감사합니다. 구체적인 질문이 하나 있습니다:

예를 들어 거주지를 나타내는 텍스트 필드와 함께 제공되는 JSON을 통해 커스텀 필드의 값을 업데이트하고 싶습니다.

How to change user fields API를 사용하여 사용자 필드를 변경하는 방법에서는 새 사용자를 생성하거나 사용자 프로필 대신 커스텀 필드를 통해 값을 변경하는 예시만 나와 있습니다.

예시:

  1. 값(예: Berlin, Hamburg)이 있는 드롭다운 커스텀 필드가 있습니다.

  2. 사용자가 Berlin이나 Hamburg 출신이 아닐 때 사용하는 텍스트 커스텀 필드가 있습니다. 이 경우 사용자는 "Hannover"을 입력합니다.

  3. 이제 드롭다운 커스텀 필드에 값(예: Berlin, Hamburg, Hannover)을 추가하고 싶은데, 어떻게 해야 하는지 모르겠습니다. 이는 목록에 없는 도시를 추가하는 일종의 자동화 과정입니다.

  4. 드롭다운 커스텀 필드는 텍스트 커스텀 필드에서 가져온 JSON 목록에 의존해야 합니다.

모든 내용을 정확히 이해한 것은 아닌 것 같습니다.

다른 사용자 필드의 내용에 따라 JSON 파일에서 동적으로 드롭다운 값을 불러오기를 원하시는 건가요?

그렇다면 테마 컴포넌트가 필요할 것 같은데, 아주 간단할 것 같지는 않습니다.

아, 알아요. 사실 커스텀 필드 값 업데이트 문제로 고생하고 있어요. 사용자 프로필을 업데이트하고 싶은 게 아니라, 드롭다운 커스텀 필드의 옵션을 업데이트하고 싶은 거예요 :sweat_smile:

음, 이건 아주 구체적인 질문이네요. API와 직접적인 관련이 있는지는 잘 모르겠고, 더 많이 DOM 조작에 관한 내용인 것 같아요. 하지만 전문가들이 지식을 공유해 주시길 기다려볼게요 :slight_smile:

이 특정 사례를 자동으로 업데이트하는 해결책을 찾았습니다. 커스텀 필드 옵션에 대한 API 업데이트 기능은 없으며, 크론 작업을 통한 서버 측 솔루션만 찾을 수 있었습니다. 저는 json 파일을 사용하지 않고 자동화를 위해 데이터베이스 항목을 사용했습니다.

사용 사례

이 자동화의 사용 사례는 사용자가 등록 시 기존 옵션을 선택할 수 있도록 하여, 더 많은 사용자가 자신의 선호도를 알릴수록 시스템이 발전하도록 돕는 것입니다. 새 사용자가 적절한 옵션을 찾을 수 없는 경우, 커스텀 텍스트 필드에 자체 텍스트를 입력할 수 있으며, 이는 다음 사용자를 위해 드롭다운 목록에 추가됩니다.

Discourse의 데이터베이스 변경 사항은 충돌을 일으킬 수 있으므로 주의해서 사용해야 하며, 경험 있는 개발자에게만 권장됩니다!

요구 사항:

단계 1:

/admin/customize/user_fields에서 두 개의 커스텀 필드를 생성합니다. 하나는 드롭다운이고, 다른 하나는 텍스트만입니다(제 예시에서는 user_field_5를 드롭다운으로, user_field_8을 텍스트로 사용했습니다).

참고: ID는 /admin/customize/user_fields.json에서 가져올 수 있습니다.

단계 2:

입력을 확인하려면 Discourse Data Explorers를 사용하는 것이 가장 좋습니다: Discourse Data Explorer

/admin/plugins/explorer에서 새 쿼리를 생성합니다:

예: User Field Options

SELECT * FROM user_field_options WHERE user_field_id='5'

user_field_id='5’를 드롭다운 user_field_id='x’로 변경합니다. 그러면 드롭다운 옵션에 표시되는 값들이 출력됩니다.

두 번째 쿼리를 생성합니다:

예: User Custom Fields

SELECT * FROM user_custom_fields WHERE name = 'user_field_8'

'user_field_8’을 텍스트 커스텀 필드 'user_field_x’로 변경합니다. 그러면 사용자가 텍스트로 입력한 값들이 출력됩니다.

단계 3: 이는 커스텀 필드의 모든 옵션이 나열되어 있는 user_field_options 데이터베이스를 업데이트하기 위한 크론 작업의 기본 토대입니다. 제 경우 user_field_5 때문에 관련 값이 5입니다. 저는 거기에 옵션을 추가하고 싶습니다.

먼저 Discourse 디렉터리에서 bash 스크립트를 생성합니다.

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 스크립트를 크론 작업으로 추가해야 합니다:

crontab -e

이것은 크론 작업 편집기를 열며, 여기서 다음 줄의 코드를 추가합니다:

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

그러면 명령이 매 분마다 실행됩니다. 물론 이는 조정할 수 있으며, update_dropdown.sh를 서버의 어디에 저장했는지에 따라 경로를 조정해야 합니다.