Come recuperare programmaticamente l'external_id per un argomento

Ciao a tutti,

Ho bisogno di recuperare il remote_id per un argomento, programmaticamente. Il contesto è: sto eseguendo uno script su api.onPageChange che recupera informazioni sull’argomento/categoria/gruppo corrente, quindi effettua una chiamata Ajax a un sistema esterno per ulteriori informazioni specifiche dell’entità.

Ho un evento api.onPageChange (di Ember?) in esecuzione e sembra che io possa ottenere tutte le informazioni di cui ho bisogno tranne il valore remote_id (sto usando il nome del campo dall’API).

Quello che ho finora:

const topicController = api.container.lookup("controller:topic");
            if (topicController) {
                const thisTopic = topicController.get("model");
                if (thisTopic) {
                         console.log(thisTopic.category.id);   // solo per esempio .. funziona perfettamente.

// .. Posso ottenere vari campi, tutti funzionano meravigliosamente .. Non riesco a trovare come ottenere il Remote ID, però (e ne ho bisogno). So che posso ottenerlo usando una chiamata JSON (aggiungendo .json all'URL della pagina corrente) ma questo sembra inefficiente .. o mi sbaglio, dovrei usare quell'approccio? Qualsiasi altra indicazione?

Grazie in anticipo!
1 Mi Piace

Solo per confermare, remote_id è il nome effettivo del campo che stai cercando? Non sono a conoscenza di quel campo utilizzato da Discourse.

4 Mi Piace

Gaah.. scusa @simon (e grazie per aver controllato la domanda)… “external_id” è il nome corretto, come da API.

Credo di aver effettivamente controllato il nome corretto (external_id), ma poi l’ho ricordato male quando ho scritto la domanda qui… ma devo assolutamente controllare. Non posso farlo ora, ma tornerò qui più tardi oggi.

Grazie ancora, lo apprezzo!

1 Mi Piace

Quindi.. stavo cercando erroneamente il campo/valore sbagliato, non quello corretto (external_id). Mi dispiace per aver fatto perdere tempo.. se può consolare, ho perso molto del mio tempo prima :frowning: :slight_smile:

La cattiva notizia è che non riesco a trovare external_id da nessuna parte nel modello Ember. Non ho familiarità con Ember, quindi sto solo rovistando, davvero.. Riesco a trovare molte altre informazioni molto utili sull’argomento, solo che non external_id (ho registrato il modello Topic nella console e ho rovistato).

Qualche suggerimento, @simon o chiunque altro? Grazie ancora.

1 Mi Piace

external_id è una proprietà del modello SingleSignOnRecord. Viene utilizzato per collegare un utente a un sito esterno quando DiscourseConnect viene utilizzato per accedere agli utenti a Discourse tramite un sito esterno. Se è questo che stai cercando, non è disponibile sul Topic. Per quanto ne so, Discourse restituisce external_id solo sul front-end per CurrentUser, quindi se stai cercando di ottenere external_id dell’autore del topic, potrebbe essere complicato.

Se pubblichi maggiori dettagli su ciò che stai cercando di realizzare, qualcuno qui potrebbe essere in grado di aiutarti. Potrebbero esserci modi più semplici per affrontare il problema rispetto a quello che stai cercando di fare.

Nessun problema. È per questo che siamo qui :slight_smile:

4 Mi Piace

Molte grazie, a tutte le parti!

Quindi, prevedo di eseguire più istanze di Discourse, nonché un sistema di amministrazione/coordinamento generale (non Discourse) in background. Gli argomenti verranno aggiunti a Discourse in uno dei 2 modi: o dagli utenti tramite il normale meccanismo di creazione di argomenti di Discourse, o dal sistema di amministrazione/coordinamento tramite l’API.

Dove l’argomento viene creato tramite l’API, rappresenterà tipicamente un’attività o un elemento di flusso di lavoro simile che avrà già il proprio ID non-Discourse… chiamiamolo “ID Esterno”.

Dove l’argomento viene creato dall’utente all’interno di Discourse, utilizzeremo i webhook per attivare una funzione Azure per creare un clone simile a un segnaposto nel sistema centrale (in modo che i messaggi di Discourse vengano collegati a un flusso più ampio di contenuti, attività, ecc.). Pertanto, di nuovo, l’Argomento Discourse indirettamente avrà un “ID Esterno” univoco, che proponiamo di aggiornare l’Argomento, tramite l’API.

Abbiamo un componente tematico Discourse personalizzato che, ogni volta che un argomento viene caricato, utilizzerà Ajax per recuperare informazioni non incentrate su Discourse dal sistema centrale e visualizzarle nella schermata dell’Argomento.

Mentre potremmo usare l’ID dell’Argomento Discourse per parametrizzare la chiamata Ajax e trovare i dati corrispondenti, è più efficiente usare l’“ID Esterno” per farlo (è semplicemente più pulito, per molteplici ragioni: evita ricerche, ecc.).

Potremmo facilmente memorizzare l’“ID Esterno” in un campo personalizzato - ne abbiamo già uno per altri dati - ma notiamo che l’API degli Argomenti ha un campo “external_id” che sembra esattamente ciò di cui abbiamo bisogno, e preferirei usarlo per varie ragioni… rende semplicemente questo campo un po’ cruciale più facile da incorporare in report, esportazioni, forse ricerche future, ecc.

Vedi lo screenshot da Discourse API Docs

Suppongo che questo sia un campo piuttosto nuovo - la maggior parte dei consigli nel forum sembra riferirsi al campo external_id dell’utente, che non è quello di cui ho bisogno al momento. Come accennato in precedenza, sto recuperando il modello Ember per l’argomento (all’interno del mio componente tematico personalizzato) e posso ottenere quasi tutte le informazioni sull’argomento tramite esso… ma non il campo external_id.

(Come sopra - sto ottenendo l’argomento usando questo codice, preso in prestito da qualche parte su questo sito, non so dove a questo punto:

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

Quindi, la richiesta: il campo external_id specifico dell’argomento è sepolto nel modello (“thisTopic”) da qualche parte, o sto fraintendendo questi concetti e dovrei semplicemente usare il campo personalizzato per memorizzare questo ID esterno (so che posso far funzionare quell’approccio, e come! .. preferisco solo la pulizia e la prontezza futura di usare l’external_id distinto, se effettivamente disponibile).

Ancora, grazie per l’aiuto, lo apprezzo!

1 Mi Piace

Non l’avevo mai notato prima. Stavo cercando qualcosa di simile qualche anno fa per associare gli ID dei post di WordPress agli argomenti di Discourse.

L’external_id dell’argomento verrà restituito come proprietà sul client solo se l’argomento ha un external_id, quindi se l’argomento non ne ha uno, non otterrai un valore null. Questo sta funzionando per me per gli argomenti che hanno un external_id:

<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("l'external_id è ", m.external_id);
        }
    }
});
</script>
3 Mi Piace

..e così, passa da ‘impossibile’ a ‘favoloso’ :slight_smile: .. brillante, questo cambia le regole del gioco per me. Non mi era venuto in mente che il modello fosse variabile, ma ha perfettamente senso.

Grazie mille, @simon, anche per l’elegante snippet di codice!

2 Mi Piace