Ich habe eine Lösung gefunden, um diesen speziellen Fall automatisch zu aktualisieren. Keine API-Update-Möglichkeit für benutzerdefinierte Feldoptionen, ich habe hier nur eine serverseitige Lösung über einen Cron-Job gefunden. Ich habe die JSON-Datei nicht verwendet, sondern die Datenbankeinträge für die Automatisierung verwendet.
Der Anwendungsfall
Der Anwendungsfall für diese Automatisierung besteht darin, neuen Benutzern die Auswahl bestehender Optionen bei der Registrierung zu ermöglichen, was dem System helfen kann, sich weiterzuentwickeln, da mehr Benutzer ihre Präferenzen bekannt geben. Wenn ein neuer Benutzer keine passende Option findet, kann er seinen eigenen Text in das benutzerdefinierte Textfeld eingeben, das dann für den nächsten Benutzer zur Dropdown-Liste hinzugefügt werden kann.
Dies sollte mit Vorsicht verwendet werden, da Änderungen an den Datenbanken für Discourse zu Abstürzen führen können. Nur für erfahrene Entwickler empfohlen!
Anforderungen:
Schritt 1:
Erstellen Sie zwei benutzerdefinierte Felder unter /admin/customize/user_fields, eines mit einem Dropdown-Menü und das andere nur mit Text (in meinem Beispiel: Dropdown mit user_field_5 und Text mit user_field_8).
Hinweis: Die ID kann unter /admin/customize/user_fields.json abgerufen werden.
Schritt 2:
Es ist am besten, Discourse Data Explorer zu verwenden, um Ihre Eingaben zu überprüfen: Discourse Data Explorer
Erstellen Sie eine neue Abfrage unter /admin/plugins/explorer:
Z.B.: User Field Options
SELECT * FROM user_field_options WHERE user_field_id='5'
Ändern Sie user_field_id=‘5’ zu Ihrer Dropdown-user_field_id=‘x’. Dann werden die Werte ausgegeben, die für Ihre Dropdown-Optionen angezeigt werden.
Erstellen Sie eine zweite Abfrage:
Z.B.: User Custom Fields
SELECT * FROM user_custom_fields WHERE name = 'user_field_8'
Ändern Sie ‘user_field_8’ zu Ihrem benutzerdefinierten Textfeld ‘user_field_x’. Dann werden die Werte ausgegeben, die Ihre Benutzer für Text eingegeben haben.
Schritt 3: Dies ist die grundlegende Grundlage für Ihren Cron-Job zur Aktualisierung der user_field_options-Datenbank, in der alle Optionen für benutzerdefinierte Felder aufgeführt sind, die für mich den zugehörigen Wert 5 haben, wegen user_field_5. Ich möchte dort Optionen hinzufügen.
Zuerst erstellen wir ein Bash-Skript im Verzeichnis für Discourse.
cd /var/discourse
nano update_dropdown.sh
Fügen Sie den folgenden Inhalt hinzu, wenn Discourse als Docker ausgeführt wird:
#!/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);\""
Stellen Sie sicher, dass Sie das Skript speichern und ausführbar machen.
chmod +x update_dropdown.sh
Dann können Sie das Skript starten und testen.
cd /var/discourse
./update_dropdown.sh
Schritt 4: Um dies zu automatisieren, müssen wir das Bash-Skript als Cron-Job hinzufügen:
crontab -e
Dies öffnet den Cron-Job-Editor, in den Sie den Code in der nächsten Zeile einfügen:
* * * * * /var/discourse/update_dropdown.sh
Dann wird der Befehl jede Minute ausgeführt. Dies kann natürlich angepasst werden, und der Pfad muss angepasst werden, je nachdem, wo Sie update_dropdown.sh auf dem Server gespeichert haben.