Pour rediriger une route Discourse existante dans un composant de thème, vous pouvez utiliser api.modifyClass pour modifier la classe de la route.
Plus d’informations sont disponibles dans la documentation d’Ember sur la redirection de routage. Voici un exemple :
<script type="text/discourse-plugin" version="0.8">
// Modifier la route des tags.
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
this._super(tag, transition);
// Si c'est dimanche, rediriger vers le sujet avec l'ID 20.
if (today.getDay() == 6) {
this.replaceWith("/t/20");
}
}
}
</script>
Si vous devez charger des données pour décider où ou s’il faut rediriger, votre hook de route doit retourner une promesse, comme expliqué dans la documentation d’Ember sur le routage asynchrone. Voici un exemple :
<script type="text/discourse-plugin" version="0.8">
const ajax = require('discourse/lib/ajax').ajax;
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
// Il semble important que ceci soit placé en premier.
this._super(tag, transition);
// Rediriger vers le premier sujet ouvert tagué à la fois avec le tag de la route et le 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];
// Vous devez prendre en compte le cas où la destination est identique à l'origine.
// Vous pourriez annuler la transition, mais ici nous laissons continuer sans redirection.
if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
context.replaceWith("/t/" + topic.id);
}
}
})
// Capturer toute erreur afin que la route (non redirigée) puisse continuer en secours.
.catch(function() {
console.log('Erreur de chargement des sujets par ajax dans le hook afterModel de la route tag-show.');
});
},
});
</script>