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
Awesome, thanks for this
Ajouter un commentaire