kgaut.net // Développeur web PHP / Drupal freelance
contactez-moi

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

Cet article a été écrit il y a plus de quatre ans, son contenu n'est peut-être plus d'actualité.

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 (1)

Comments