Ciao, sto attualmente lavorando su un plugin specifico ma non ho ancora capito da dove iniziare (ho letto il materiale introduttivo qui e ho installato alcuni plugin semplici e ho giocato un po’ con il loro codice sorgente).
La configurazione: Ho un file CSV che contiene diversi nomi utente dal sistema e alcuni tag a cui sono correlati. Ad esempio, una voce “user1, tag#1” legge: “user1 conosce il tag#1”. Molti utenti possono essere correlati a un tag e un utente può essere correlato a molti tag. Inoltre, questo CSV verrà aggiornato di volta in volta (una volta quasi ogni giorno). Il file si trova sullo stesso server che ospita l’istanza di discourse.
Come funzionerebbe idealmente il plugin: Spiegherò questo usando un esempio di CSV e un’immagine.
CSV:
userOP, tag#1
userOP, tag#2
user2, tag#1
Dato questo CSV, ogni volta che viene creato un argomento con uno dei tag inclusi nel CSV (l’autore dell’argomento potrebbe non essere nell’elenco). L’output ideale dovrebbe essere il seguente:
Inoltre, un utente può vedere i propri tag conosciuti come collegamenti cliccabili nel proprio pannello utente con una scheda aggiuntiva chiamata Tag conosciuti:
Cioè, in base alla relazione definita nel CSV, dovrebbe esserci un piccolo testo o un badge per qualsiasi utente (OP o altri) che pubblica nell’argomento con un tag a cui è correlato.
Sono aperto a suggerimenti su come realizzare questo.
Sul lato Rails, dovrai aggiungere quelle relazioni utente/tag al serializer in modo che quei dati siano disponibili al front-end. Cerca altri plugin che chiamano add_to_serializer o cercala nel codice sorgente di Discourse, poiché è ben documentata lì.
Quindi potrai usare un plugin outlet in Ember per aggiungerlo alla pagina. La documentazione del componente tema ha esempi di questo.
Probabilmente aggiungerei una route per gestire i campi utente personalizzati piuttosto che usare un file CSV, ma se vuoi procedere con il CSV, potresti voler creare un job che lo legga ogni ora o qualcosa del genere, quindi cerca un plugin che abbia qualcosa in jobs/scheduled.
Esiste un repository di Discourse chiamato all_the_plugins che a volte uso per cercare esempi di cose. Se ti addentri in github.com/discourse dovresti essere in grado di trovarlo.
Grazie per le informazioni. Il modello mentale che ho al momento è che dovrei aggiungere un campo personalizzato ai tag (come tag_description) chiamato attached_users. Per l’esempio sopra, tag#1 dovrebbe avere attached_users: [“userOP”, “user1”].
Quindi, dovrei in qualche modo aggiungerlo al serializer e capire come visualizzarlo nel post.
Mentre ci pensavo, ho avuto un’altra idea. Se usassi discourse assign (Discourse Assign) per assegnare questi utenti agli argomenti in base ai tag. Posso già recuperare queste informazioni dall’argomento e immagino che visualizzarle sarebbe più facile. Tuttavia, discourse assign non fornisce alcun modo per aggiungere utenti programmaticamente.
Mi chiedo se non metterebbe troppo peso sul server. Perché ci saranno molti incarichi e nell’idea precedente, si tratta essenzialmente solo di un incarico ai tag e non deve essere assegnato separatamente a ciascun argomento.
Aggiungere un campo personalizzato utente chiamato known_tags, una lista di stringhe.
Aggiungere un’interfaccia nel profilo utente dove l’utente può modificare known_tags. Non penso sia necessario aggiungere una nuova scheda di profilo per questo, ma potresti farlo se volessi. Se non vuoi che gli utenti lo modifichino da soli, rendilo modificabile solo dagli amministratori e vai semplicemente nei profili utente e aggiornalo in base al tuo file CSV.
Aggiungere un hook di evento che utilizzi gli eventi before_create_post o post_created in PostCreator per aggiungere il contenuto desiderato al post in base ai tag dell’argomento.
Come fare
Le parti 1 e 2 sono molto simili ai plugin di esempio per altri modelli negli argomenti collegati di seguito. Cerca di capirlo per analogia. Se ti blocchi davvero, chiedimi un suggerimento lì.
La parte 3 andrà anche nel tuo file plugin.rb. Sarà qualcosa di simile a questo
Prova a farlo da solo. Se ti blocchi davvero, ti aiuterò. Sono sempre più propenso ad aiutare se ci sono forti prove che stai cercando di capirlo da solo
Grazie mille per aver fornito una roadmap molto bella, ci sto lavorando! Piccola domanda:
Questa parte deve essere manuale con questo approccio (per manuale intendo aggiungere voci una per una tramite un’interfaccia)? Idealmente, vorrei aggiungerlo usando la mia chiave API di amministratore poiché il file csv è un po’ carico e crescerà nel tempo.
No, non è necessario che sia manuale. Ci sono diversi modi in cui potresti compilare i campi personalizzati dell’utente in base al CSV. Dipende davvero da come vuoi gestire gli aggiornamenti. Ti suggerisco di fare prima le altre parti e di testare questo con un piccolo set di dati. Quindi, se sei soddisfatto di come funziona, aggiungi un’importazione automatica per il CSV. Rendere efficiente quella parte è un passo secondario.