Dynamisch verfügbare Benutzerfeldwerte während einer Profilerstellung aktualisieren

Vielen Dank für die schnellen Antworten @JammyDodger und @Canapin , ich habe eine spezielle Frage:

Ich möchte Werte in einem benutzerdefinierten Feld über ein Textfeld aktualisieren, das beispielsweise den Wohnort angibt und von einem JSON begleitet wird.

Wie man Benutzerfelder ändert mit API, es gibt nur ein Beispiel, um neue Benutzer zu erstellen oder Werte über benutzerdefinierte Felder anstelle des Profils eines Benutzers zu ändern.

Als Beispiel:

  1. Es gibt ein benutzerdefiniertes Dropdown-Feld mit Werten (z. B. Berlin, Hamburg).

  2. Es gibt ein benutzerdefiniertes Textfeld, das verwendet wird, wenn der Benutzer nicht aus Berlin oder Hamburg kommt; er gibt „Hannover“ ein.

  3. Ich möchte dann das benutzerdefinierte Dropdown-Feld mit Werten (z. B. Berlin, Hamburg, Hannover) hinzufügen, weiß aber nicht, wie das geht. Es ist eine Art Automatisierung, um Städte hinzuzufügen, die nicht aufgeführt sind.

  4. Das benutzerdefinierte Dropdown-Feld sollte von einer JSON-Liste aus einem benutzerdefinierten Textfeld abhängen.

Ich bin mir nicht sicher, ob ich alles verstehe…

Sie möchten dynamische Dropdown-Werte haben – geladen aus einer JSON-Datei –, die vom Inhalt eines anderen Benutzerfeldes abhängen?

Das würde wahrscheinlich eine Theme-Komponente erfordern, aber ich bin mir nicht sicher, ob es sehr einfach ist.

1 „Gefällt mir“

Ich weiß, ich weiß, eigentlich kämpfe ich mit dem Update-Problem für benutzerdefinierte Feldwerte, ich möchte das Benutzerprofil nicht aktualisieren. Ich möchte die Optionen in einem Dropdown-Benutzerfeld aktualisieren :sweat_smile:

Das ist eine sehr spezifische Frage, und ich bin mir nicht sicher, ob sie unbedingt mit der API zusammenhängt. Eher mit DOM-Manipulation. Aber ich überlasse es den Experten, ihr Wissen zu teilen :slight_smile:

1 „Gefällt mir“

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.

3 „Gefällt mir“

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