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

**URL:** https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944
**Category:** Development
**Created:** [4월 17, 2023, 11:31오전 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944 "2023-04-17T11:31:57Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![philipp96](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/philipp96/32/305474_2.png) [@philipp96](https://meta.discourse.org/u/philipp96)
#### Post date: [4월 17, 2023, 11:31오전 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944/1 "2023-04-17T11:31:57Z")

</div>

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

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

[How to change user fields](https://meta.discourse.org/t/how-to-change-user-fields-with-api/147999/2) API를 사용하여 사용자 필드를 변경하는 방법에서는 새 사용자를 생성하거나 사용자 프로필 대신 커스텀 필드를 통해 값을 변경하는 예시만 나와 있습니다.

### 예시:

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

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

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

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [4월 17, 2023, 11:53오전 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944/2 "2023-04-17T11:53:16Z")

</div>

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

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

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

---

<div class="post-metadata">

### Author: ![philipp96](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/philipp96/32/305474_2.png) [@philipp96](https://meta.discourse.org/u/philipp96)
#### Post date: [4월 17, 2023, 1:02오후 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944/4 "2023-04-17T13:02:02Z")

</div>

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

---

<div class="post-metadata">

### Author: ![Canapin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/canapin/32/119591_2.png) [@Canapin](https://meta.discourse.org/u/Canapin)
#### Post date: [4월 17, 2023, 1:09오후 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944/5 "2023-04-17T13:09:16Z")

</div>

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

---

<div class="post-metadata">

### Author: ![philipp96](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/philipp96/32/305474_2.png) [@philipp96](https://meta.discourse.org/u/philipp96)
#### Post date: [4월 22, 2023, 1:37오후 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944/6 "2023-04-22T13:37:32Z")

</div>

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

#### **사용 사례**

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

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

요구 사항:

- [Discourse Data Explorer](https://meta.discourse.org/t/discourse-data-explorer/32566)
- Docker를 통해 설치된 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](https://meta.discourse.org/t/discourse-data-explorer/32566)

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

예: User Field Options

```plaintext
SELECT * FROM user_field_options WHERE user_field_id='5'

```

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

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

예: User Custom Fields

```plaintext
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 스크립트를 생성합니다.

```plaintext
cd /var/discourse
nano update_dropdown.sh

```

Discourse가 Docker로 실행되는 경우 다음 내용을 추가합니다:

```plaintext
#!/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);\""

```

스크립트를 저장하고 실행 가능하도록 하는지 확인하세요.

```plaintext
chmod +x update_dropdown.sh

```

그런 다음 스크립트를 시작하고 테스트할 수 있습니다.

```plaintext
cd /var/discourse
./update_dropdown.sh 

```

## 단계 4: 이를 자동화하려면 bash 스크립트를 크론 작업으로 추가해야 합니다:

```plaintext
crontab -e

```

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

```plaintext
* * * * * /var/discourse/update_dropdown.sh

```

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

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [5월 22, 2023, 1:38오후 UTC](https://meta.discourse.org/t/dynamically-update-available-user-field-values-during-a-profile-fill-in/261944/7 "2023-05-22T13:38:18Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
