Umleitung einer bestehenden Route in einer Theme-Komponente

Um eine bestehende Discourse-Route in einer Theme-Komponente umzuleiten, können Sie api.modifyClass verwenden, um die Route-Klasse zu ändern.

Weitere Informationen finden Sie in der Ember-Dokumentation zur Weiterleitung beim Routing. Hier ist ein Beispiel:

<script type="text/discourse-plugin" version="0.8"> 
    // Die Tag-Route ändern. 
    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            this._super(tag, transition);
            // Wenn es Sonntag ist, zur Topic mit der ID 20 umleiten.
            if (today.getDay() == 6) {
                this.replaceWith("/t/20");
            }
        }
    }
</script>

Wenn Sie Daten laden müssen, um zu entscheiden, wohin oder ob umgeleitet werden soll, müssen Sie Ihren Route-Hook ein Promise zurückgeben lassen, wie in der Ember-Dokumentation zum asynchronen Routing beschrieben. Hier ist ein Beispiel:

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

    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            // Es scheint wichtig zu sein, dass dies zuerst kommt.
            this._super(tag, transition);

            // Zur ersten offenen Topic umleiten, die sowohl mit dem Route-Tag als auch mit dem 'canonical'-Tag versehen ist.
            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];
                    // Sie müssen den Fall berücksichtigen, in dem das Ziel identisch mit dem Ursprung ist.
                    // Sie könnten die Transition abbrechen, aber hier erlauben wir, dass sie ohne Umleitung fortgesetzt wird.
                    if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
                        context.replaceWith("/t/" + topic.id);
                    }
                }
            })
            // Fehler abfangen, damit die (nicht umgeleitete) Route als Fallback fortgesetzt werden kann.
            .catch(function() {
                console.log('Fehler beim Laden der Topics per Ajax im afterModel-Hook der tag-show-Route.');
            });
        },
    });
</script>
8 „Gefällt mir“