プロフィールの入力中に利用可能なユーザーフィールド値を動的に更新する

迅速なご対応ありがとうございます @JammyDodger@Canapin。具体的な質問があります。

例えば、居住地を示すテキストフィールドとJSONを介してカスタムフィールドの値を更新したいと考えています。

APIを使用してユーザーフィールドを変更する方法には、新しいユーザーを作成したり、カスタムフィールドを介してユーザーのプロフィール値を変更したりする例しかありません。

例:

  1. 値(例:ベルリン、ハンブルク)を持つドロップダウンカスタムフィールドがあります。

  2. ユーザーがベルリンまたはハンブルクの出身でない場合に「ハノーバー」と入力するために使用されるテキストカスタムフィールドがあります。

  3. 次に、値(例:ベルリン、ハンブルク、ハノーバー)を持つドロップダウンカスタムフィールドを追加したいのですが、その方法がわかりません。リストにない都市を追加するための自動化のようなものです。

  4. ドロップダウンカスタムフィールドは、テキストカスタムフィールドからのJSONリストに依存する必要があります。

よく理解できていないのですが…

別のユーザーフィールドの内容に応じて、JSONファイルから読み込まれる動的なドロップダウン値が必要ということでしょうか?

それにはおそらくテーマコンポーネントが必要になると思いますが、それが非常に簡単かどうかはわかりません。

「いいね!」 1

わかっています、わかっています。実際、カスタムフィールド値の更新で苦労しています。ユーザープロフィールを更新したくありません。ドロップダウンカスタムフィールドのオプションを更新したいのです😅

これは非常に具体的な質問ですね。APIに直接関連するというよりは、DOMの操作に関するものかもしれません。専門家の皆さんの知識を共有していただければと思います :slight_smile:

「いいね!」 1

この特定のケースを自動的に更新するソリューションを見つけました。カスタムフィールドオプションのAPI更新の可能性はありません。ここではcronジョブを介したサーバーサイドソリューションしか見つかりませんでした。自動化のためにJSONファイルは使用せず、データベースエントリを使用しました。

ユースケース

この自動化のユースケースは、新規ユーザーが登録時に既存のオプションを選択できるようにすることです。これにより、ユーザーの好みがより多く知られるにつれてシステムを進化させることができます。新しいユーザーが適切なオプションを見つけられない場合は、カスタムテキストフィールドに独自のテキストを入力でき、それを次のユーザーのためにドロップダウンリストに追加できます。

これは注意して使用する必要があります。Discourseのデータベースへの変更はクラッシュする可能性があるため、経験豊富な開発者のみに推奨されます!

要件:

ステップ1:

/admin/customize/user_fieldsで2つのカスタムフィールドを作成します。1つはドロップダウン、もう1つはテキストのみ(私の例では、ユーザーフィールド5のドロップダウン、ユーザーフィールド8のテキスト)です。

注:IDは/admin/customize/user_fields.jsonから取得できます。

ステップ2:

入力内容を確認するには、Discourse Data Explorerを使用するのが最適です:Discourse Data Explorer

/admin/plugins/explorerの下に新しいクエリを作成します:

例:ユーザーフィールドオプション

SELECT * FROM user_field_options WHERE user_field_id='5'

user_field_id='5’をドロップダウンのuser_field_id='x’に変更します。これにより、ドロップダウンオプションに表示される値が出力されます。

2番目のクエリを作成します:

例:ユーザーカスタムフィールド

SELECT * FROM user_custom_fields WHERE name = 'user_field_8'

'user_field_8’をテキストカスタムフィールドの’user_field_x’に変更します。これにより、ユーザーがテキストに入力した値が出力されます。

ステップ3:これは、カスタムフィールドのすべてのオプションがリストされているuser_field_optionsデータベースを更新するためのcronジョブの基本的な基盤です。私の場合、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スクリプトをcronジョブとして追加する必要があります。

crontab -e

これによりcronジョブエディタが開きます。次の行にコードを追加します。

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

これにより、コマンドが1分ごとに実行されます。これはもちろん調整可能であり、update_dropdown.shをサーバーのどこに保存したかによってパスを調整する必要があります。

「いいね!」 3

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