Ciao, sto lavorando al mio primo plugin per Discourse.
L’idea
Vogliamo modificare leggermente il comportamento dei collegamenti ai tag: quando si clicca su un tag in qualsiasi punto di Discourse, invece di reindirizzare direttamente ad esso, vengono mostrate due opzioni: l’URL normale del tag (forum.com/tag/nome-tag) o una pagina esterna correlata di nostra scelta (something.site.com/some-name). Questa opzione dovrebbe apparire solo per i tag presenti nell’elenco.
L’elenco sarà sotto forma di un array Ruby di hash (o JSON) e può essere aggiunto direttamente al plugin o reso disponibile tramite un URL. (La prima opzione sembra più efficiente in termini di risorse: possiamo aggiornare l’elenco e ricostruire il plugin quando necessario, dato che gli aggiornamenti non saranno frequenti.)
# Array Ruby di hash
array = [
{forum_tag: "discourse", external_slug: "discourse"},
{forum_tag: "dc", external_slug: "discourse"},
{forum_tag: "xenforo", external_slug: "xenforo"},
{forum_tag: "xf", external_slug: "xenforo"}
]
# OPPURE
array.to_json
=> "[{\"forum_tag\":\"discourse\",\"external_slug\":\"discourse\"},{\"forum_tag\":\"dc\",\"external_slug\":\"discourse\"},{\"forum_tag\":\"xenforo\",\"external_slug\":\"xenforo\"},{\"forum_tag\":\"xf\",\"external_slug\":\"xenforo\"}]"
In pratica, vogliamo che l’opzione appaia come quando si clicca sul numero di risposte nella pagina principale del forum:
Le mie riflessioni
Ho trovato 2 metodi nell’API di Discourse relativi ai tag:
-
addTagsHtmlCallback- In questo caso, dovrei impostaretopic.tagscome array vuoto subito dopo aver assegnato il suo valore a un’altra variabile. In questo modo impedirei il rendering deitage potrei scrivere il mio codice personalizzato. -
replaceTagRenderer- Il secondo metodo mi permette di modificare il rendering deltag, il che sembra meno “hacky” rispetto al primo metodo.
Tuttavia, in entrambi i casi devo restituire una stringa raw. Da quanto ho scoperto, non posso scrivere e compilare manualmente un template Ember. Ovviamente potrei semplicemente renderizzare collegamenti personalizzati e scrivere una semplice funzione con jQuery inserendola nella radice di app/assets/javascripts, ma si tratta di una soluzione molto diversa rispetto al codice di Discourse.
Sto seguendo la strada giusta? Qualsiasi aiuto sarà molto apprezzato.
