Wie man die external_id für ein Thema programmatisch abruft

Hallo zusammen,

ich muss programmatisch die remote_id für ein Thema abrufen. Der Hintergrund: Ich führe ein Skript auf api.onPageChange aus, das Informationen über das aktuelle Thema/die Kategorie/die Gruppe abruft und dann einen Ajax-Aufruf an ein externes System für weitere entitätenspezifische Informationen durchführt.

Ich habe ein (Ember?) api.onPageChange-Ereignis laufen und scheine alle benötigten Informationen abrufen zu können, außer dem remote_id-Wert (ich verwende den Feldnamen aus der API).

Was ich bisher habe:

const topicController = api.container.lookup(“controller:topic”);
if (topicController) {
const thisTopic = topicController.get(“model”);
if (thisTopic) {
console.log(thisTopic.category.id); // zum Beispiel .. funktioniert perfekt.

.. Ich kann verschiedene Felder abrufen, alles funktioniert wunderbar .. Ich kann jedoch nicht herausfinden, wie ich die Remote-ID erhalte (und ich brauche sie). Ich weiß, dass ich sie über einen JSON-Aufruf abrufen kann (indem ich .json zur aktuellen Seiten-URL hinzufüge), aber das scheint ineffizient zu sein .. oder liege ich falsch, sollte ich diesen Ansatz verwenden? Gibt es andere Hinweise?

Vielen Dank im Voraus!

1 „Gefällt mir“

Nur zur Bestätigung, ist remote_id der tatsächliche Name des Feldes, nach dem Sie suchen? Mir ist kein Feld bekannt, das von Discourse verwendet wird.

4 „Gefällt mir“

Gaah.. Entschuldigung @simon (und danke, dass du dir die Frage angesehen hast) .. „external_id“ ist der korrekte Name, gemäß der API.

Ich glaube, ich habe tatsächlich nach dem richtigen Namen (external_id) gesucht, ihn aber dann falsch erinnert, als ich die Frage hier aufgeschrieben habe. Ich muss das aber definitiv überprüfen. Ich kann das im Moment nicht tun, aber ich werde mich später am Tag hier wieder melden.

Danke nochmals, ich weiß es zu schätzen!

1 „Gefällt mir“

Also .. ich habe versehentlich nach dem falschen Feld/Wert gesucht, nicht nach dem richtigen (external_id). Entschuldigung für die Zeitverschwendung .. wenn es ein Trost ist, habe ich zuerst viel von meiner eigenen verschwendet :frowning: :slight_smile:

Die schlechte Nachricht ist - ich kann external_id nirgendwo im Ember-Modell finden. Ich bin mit Ember nicht vertraut, also stöbere ich nur herum. Ich kann viele andere sehr nützliche Topic-Informationen finden, nur nicht external_id (ich habe das Topic-Modell in der Konsole protokolliert und herumgestöbert).

Irgendwelche Hinweise, @simon oder irgendjemand? Danke nochmal.

1 „Gefällt mir“

external_id ist eine Eigenschaft des SingleSignOnRecord-Modells. Es wird verwendet, um einen Benutzer mit einer externen Website zu verknüpfen, wenn DiscourseConnect verwendet wird, um Benutzer über eine externe Website bei Discourse anzumelden. Wenn Sie dies suchen, ist es auf dem Topic nicht verfügbar. Soweit ich weiß, gibt Discourse die external_id nur im Frontend für den CurrentUser zurück. Wenn Sie also versuchen, so etwas wie die external_id des Autors des Topics abzurufen, könnte das schwierig sein.

Wenn Sie weitere Details dazu posten, was Sie erreichen möchten, kann Ihnen hier vielleicht jemand helfen. Es gibt möglicherweise einfachere Wege, das Problem anzugehen, als das, was Sie versuchen.

Kein Problem. Dafür sind wir da :slight_smile:

4 „Gefällt mir“

Vielen Dank, alle Teile!

Ich gehe davon aus, mehrere Instanzen von Discourse sowie ein übergeordnetes (nicht-Discourse) Admin-/Koordinationssystem im Hintergrund zu betreiben. Themen werden auf eine von zwei Arten zu Discourse hinzugefügt – entweder von Benutzern über den üblichen Discourse-Mechanismus zur Themen-Erstellung oder vom Admin-/Koordinationssystem über die API.

Wenn ein Thema über die API erstellt wird, repräsentiert es typischerweise eine Aufgabe oder ein ähnliches Workflow-Element, das bereits seine eigene Nicht-Discourse-ID hat – nennen wir sie die „Externe ID“.

Wenn das Thema vom Benutzer innerhalb von Discourse erstellt wird, verwenden wir Webhooks, um eine Azure-Funktion auszulösen, die einen Stub-ähnlichen Klon im zentralen System erstellt (damit die Discourse-Nachrichten in einen breiteren Strom von Inhalten, Aufgaben usw. integriert werden). Daher wird das Discourse-Thema indirekt wieder eine eindeutige „Externe ID“ haben – die wir vorschlagen, das Thema über die API zu aktualisieren.

Wir haben eine maßgeschneiderte Discourse-Themenkomponente, die beim Laden jedes Themas Ajax verwendet, um Nicht-Discourse-zentrierte Informationen aus dem zentralen System abzurufen und diese auf dem Thema-Bildschirm anzuzeigen.

Während wir die Discourse-Themen-ID verwenden könnten, um den Ajax-Aufruf zu parametrisieren und die übereinstimmenden Daten zu finden, ist es effizienter, die „Externe ID“ dafür zu verwenden (es ist einfach sauberer, aus mehreren Gründen – es vermeidet Nachschlagevorgänge usw.).

Wir könnten die „Externe ID“ problemlos in einem benutzerdefinierten Feld speichern – wir haben bereits eines für andere Daten –, aber wir stellen fest, dass die Topics API ein Feld „external_id“ hat, das genau so aussieht, wie wir es brauchen, und ich würde es aus verschiedenen Gründen lieber verwenden – es erleichtert die Einbeziehung dieses etwas entscheidenden Feldes in Berichte, Exporte, vielleicht zukünftige Suchen usw.

Siehe den Screengrab von Discourse API Docs

Ich vermute, dies ist ein eher neues Feld – die meiste Beratung im Forum scheint sich auf das User-external_id-Feld zu beziehen, was ich im Moment nicht brauche. Wie oben erwähnt, rufe ich das Ember-Modell für das Thema ab (innerhalb meiner benutzerdefinierten Themenkomponente) und kann fast alle Informationen über das Thema darüber erhalten … aber nicht das external_id-Feld.

(Wie oben – ich erhalte das Thema mit diesem Code, der irgendwo von dieser Seite ausgeliehen wurde, weiß im Moment nicht woher:

        const topicController = api.container.lookup("controller:topic");
        if (topicController) {
            const thisTopic = topicController.get("model");

Also, die Anfrage – ist das themenspezifische external_id-Feld irgendwo im Modell („thisTopic“) versteckt, oder missverstehe ich diese Konzepte und sollte ich einfach das benutzerdefinierte Feld verwenden, um diese externe ID zu speichern (ich weiß, wie ich diesen Ansatz zum Laufen bringe und wie! .. ich bevorzuge einfach die Sauberkeit und Zukunftsfähigkeit der Verwendung der separaten external_id, falls sie tatsächlich verfügbar ist).

Nochmals vielen Dank für die Hilfe, ich weiß sie zu schätzen!

1 „Gefällt mir“

Das ist mir vorher nie aufgefallen. Ich habe vor ein paar Jahren nach etwas Ähnlichem gesucht, um WordPress-Post-IDs mit Discourse-Themen zu verknüpfen.

Die external_id des Themas wird nur als Eigenschaft auf dem Client zurückgegeben, wenn das Thema eine external_id hat. Wenn das Thema also keine hat, erhalten Sie keinen null-Wert. Dies funktioniert für mich bei Themen, die eine external_id haben:

<script type="text/discourse-plugin" version="0.11.0">
api.onPageChange (() => {
    const c = api.container.lookup("controller:topic");
    if (c) {
        const m = c.get("model");
        if (m && m.hasOwnProperty('external_id')) {
        console.log("die external_id ist ", m.external_id);
        }
    }
});
</script>
3 „Gefällt mir“

.. und so wird aus „unmöglich“ „fabelhaft“ :slight_smile: .. brillant, das ist für mich ein echter Game-Changer. Es war mir nicht in den Sinn gekommen, dass das Modell variabel sein würde, aber es ergibt total Sinn.

Vielen Dank, @simon, auch für den eleganten Code-Schnipsel!

2 „Gefällt mir“