Drupal 8 - Utiliser les redirections de Redirect sur une page dépubliée

Posté le Lundi 8 juillet 2019 - 08:52
Dernière mise à jour le Lundi 29 juillet 2019 - 15:43

Dans le cas d'une page dé-publiée, si en tant qu'anonyme on tombe sur une erreur 403. On peut vouloir rediriger cette page temporairement vers une autre via le module redirect, mais nativement ça n'est pas pris en compte.

Voici un petit EventSubscriber qui répond sur les erreurs 403, qui teste si une redirection existe pour le nœud courant, et dans ce cas redirige l'utilisateur.

Note : Un administrateur ayant la permission pour voir le contenu dé-publié ne sera pas redirigé, car aucune erreur 403 ne sera lancée et donc l'event subscriber ne sera pas appelé.

Note 2 : C'est un bout de code qui semble fonctionnel, fonctionne avec le multilingue mais qui est certainement perfectible. N'hésitez-pas à me faire vos remarques.

1 - Déclaration de l'event subscriber :

  1. #mon_module.services.yml
  2.  
  3.   mon_module.redirector:
  4.   class: Drupal\mon_module\EventSubscriber\Redirector
  5.   tags:
  6.   - { name: event_subscriber }

2 - Définition de l'event subscriber 

  1. # web/modules/custom/mon_module/src/EventSubscriber/Redirector.php
  2. <?php
  3.  
  4. namespace Drupal\mon_module\EventSubscriber;
  5.  
  6. use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
  7. use Drupal\redirect\RedirectRepository;
  8. use Drupal\node\Entity\Node;
  9. use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
  10. use Symfony\Component\HttpFoundation\RedirectResponse;
  11.  
  12. class Redirector extends HttpExceptionSubscriberBase {
  13.  
  14. /**
  15.   * {@inheritdoc}
  16.   */
  17. protected function getHandledFormats() {
  18. return ['html'];
  19. }
  20.  
  21. public function on403(GetResponseForExceptionEvent $event) {
  22. if ($event->getRequest()->attributes->get('node') !== NULL) {
  23. $nid = \Drupal::routeMatch()->getRawParameter('node');
  24. $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
  25. /** @var RedirectRepository $redirectRepository */
  26. $redirectRepository = \Drupal::service('redirect.repository');
  27. $node = Node::load($nid);
  28. if ($node !== NULL && $node->hasTranslation($langcode) && $translation = $node->getTranslation($langcode)) {
  29. if (!$translation->isPublished()) {
  30. $alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/' . $nid);
  31. $redirection = $redirectRepository->findMatchingRedirect($alias, [], $langcode);
  32. if($redirection) {
  33. $event->setResponse(new RedirectResponse($redirection->getRedirectUrl()->toString(), $redirection->getStatusCode()));
  34. }
  35. }
  36. }
  37. }
  38. }
  39.  
  40. }

 

 

Commentaires

Ajouter un commentaire

Ne sera pas publié

HTML restreint

  • Balises HTML autorisées : <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Les adresses de pages web et les adresses courriel se transforment en liens automatiquement.
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...