Reindirizza una rotta esistente in un componente tema

Per reindirizzare una route Discourse esistente in un componente del tema, puoi utilizzare api.modifyClass per modificare la classe della route.

Ulteriori informazioni sono disponibili nella documentazione di Ember sul reindirizzamento delle route. Ecco un esempio:

<script type="text/discourse-plugin" version="0.8"> 
    // Modifica la route dei tag. 
    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            this._super(tag, transition);
            // Se è domenica, reindirizza al topic con id 20.
            if (today.getDay() == 6) {
                this.replaceWith("/t/20");
            }
        }
    }
</script>

Se hai bisogno di caricare dati per decidere dove o se reindirizzare, devi far sì che il hook della tua route restituisca una promise, come discusso nella documentazione di Ember sul routing asincrono. Ecco un esempio:

<script type="text/discourse-plugin" version="0.8">
    const ajax = require('discourse/lib/ajax').ajax;

    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            // Sembra che sia importante che questo venga eseguito per primo.
            this._super(tag, transition);

            // Reindirizza al primo topic aperto contrassegnato sia dal tag della route che dal tag 'canonical'.            
            var path = `/tags/intersection/canonical/${tag.id}.json`;
            const context = this;
            return ajax(path).then(function(result){
                var topics = result.topic_list.topics.filter(function(topic) { 
                   return !topic.closed ;
                });
                if (topics && topics.length > 0) {
                    var topic = topics[0];
                    // Devi considerare il caso in cui la destinazione sia la stessa dell'origine.
                    // Potresti annullare la transizione, ma qui permettiamo che proceda senza reindirizzamento.
                    if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
                        context.replaceWith("/t/" + topic.id);
                    }
                }
            })
            // Cattura eventuali problemi in modo che la route (non reindirizzata) possa procedere come fallback. 
            .catch(function() {
                console.log('Errore nel caricamento dei topic tramite ajax nel hook afterModel della route tag show.');
            });
        },
    });
</script>
8 Mi Piace