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 :

#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()));
          }
        }
      }
    }
  }

}

 

Aller plus loin ?

Commentaires

Safdriya Quran <a href="https://safdriyaquran.com/"> Online Quran Acadmey </a> provides Online Quran Classes. Safdriya Quran is an online Quran academy where individuals can learn and study the Quran online. Safdriya Quran provides a convenient way for people to learn and explore the Quran from the comfort of their own homes.

Ajouter un commentaire

Ne sera pas publié

Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...