在个人资料填写过程中动态更新可用用户字段值

感谢 @JammyDodger@Canapin 的及时回复,我有一个具体问题:

我想通过一个文本字段更新自定义字段中的值,该字段例如指示居住地,并附带一个 JSON。

如何通过 API 更改用户字段,其中只有一个示例用于创建新用户或通过自定义字段更改用户个人资料的值。

举例说明:

  1. 有一个带有值的下拉自定义字段(例如,柏林、汉堡)。

  2. 有一个文本自定义字段,当用户不是来自柏林或汉堡时使用,他们会输入“汉诺威”。

  3. 然后我想添加带有值的下拉自定义字段(例如,柏林、汉堡、汉诺威),但我不知道如何做到这一点。这是一种添加未列出城市的自动化方法。

  4. 下拉自定义字段应取决于自定义文本字段中的 JSON 列表。

我不太确定是否都明白了……

您想让动态下拉菜单的值——从一个 json 文件加载——取决于另一个用户字段的内容?

这可能需要一个主题组件,但我不太确定它是否非常容易。

1 个赞

我知道,我知道,其实我正在为自定义字段值的更新而烦恼,我不想更新用户配置文件。我想更新下拉自定义字段中的选项 :sweat_smile:

所以这是一个非常具体的问题,我不确定它是否一定与API有关。更像是DOM操作。但我会让专家们分享他们的知识:)

1 个赞

我找到了一个自动更新此特定案例的解决方案。自定义字段选项没有 API 更新的可能性,我只在这里通过 cron 作业找到了一个服务器端解决方案。我没有使用 json 文件,而是使用了数据库条目进行自动化。

用例

此自动化的用例是允许新用户在注册时选择现有选项,这可以随着用户表达更多偏好而帮助系统发展。如果新用户找不到合适的选项,他们可以在自定义文本字段中输入自己的文本,然后将其添加到下一个用户的下拉列表中。

这应该谨慎使用,因为对 Discourse 数据库的更改可能导致崩溃,仅推荐给有经验的开发人员!

要求:

步骤 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 下创建一个新查询:

例如:用户字段选项

SELECT * FROM user_field_options WHERE user_field_id='5'

将 user_field_id=‘5’ 更改为您的下拉用户字段 user_field_id=‘x’,然后将显示下拉选项的值。

创建第二个查询:

例如:用户自定义字段

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

然后该命令将每分钟执行一次。当然,这可以进行调整,并且路径必须根据您在服务器上存储 update_dropdown.sh 的位置进行调整。

3 个赞

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