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

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 :

#mon_module.services.yml

  mon_module.redirector:
    class: Drupal\mon_module\EventSubscriber\Redirector
    tags:
      - { name: event_subscriber }

2 - Définition de l'event subscriber 

# web/modules/custom/mon_module/src/EventSubscriber/Redirector.php
<?php

namespace Drupal\mon_module\EventSubscriber;

use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Drupal\redirect\RedirectRepository;
use Drupal\node\Entity\Node;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;

class Redirector extends HttpExceptionSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function getHandledFormats() {
    return ['html'];
  }

  public function on403(GetResponseForExceptionEvent $event) {
    if ($event->getRequest()->attributes->get('node') !== NULL) {
      $nid = \Drupal::routeMatch()->getRawParameter('node');
      $langcode = \Drupal::languageManager()->getCurrentLanguage()->getId();
      /** @var RedirectRepository $redirectRepository */
      $redirectRepository = \Drupal::service('redirect.repository');
      $node = Node::load($nid);
      if ($node !== NULL && $node->hasTranslation($langcode) && $translation = $node->getTranslation($langcode)) {
        if (!$translation->isPublished()) {
          $alias = \Drupal::service('path.alias_manager')->getAliasByPath('/node/' . $nid);
          $redirection = $redirectRepository->findMatchingRedirect($alias, [], $langcode);
          if($redirection) {
            $event->setResponse(new RedirectResponse($redirection->getRedirectUrl()->toString(), $redirection->getStatusCode()));
          }
        }
      }
    }
  }

}

 

Commentaires

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...