Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

Redirect wenn kein Zugriff (oder auch sonst)

Eingetragen von torfnase (1525)
am 01.11.2021 - 13:52 Uhr in
  • Allgemeines zu Drupal
  • Drupal 8.x oder neuer

Hallo zusammen,
ich suche noch nach einer geeigneten Methode, wie ich einen Redirect geschickt einbauen kann.

Ich rufe ein URL auf, die einen Parameter enthält, z.B. /home am Ende.
nun möchte ich, wenn diese Seite einen Access-Denied liefert, am Ende das /home durch ein about ersetzen.

Sowas in der Art. Ich schätze mal, ich würde dazu eine eigene Funktion benötigen. Sowas gibt es bestimmt nicht als Modul. Vielleicht kann man das über deine page-preprocess-Funktion regeln.

Ich habe es hier mal als Frage reingestellt, denn ich könnte mir vorstellen, dass interessiert viele und vielleicht gibt es ja eine bessere Lösung als die preprocess-Funktion. Mal schauen, was ihr so in Petto habt.

Gruß Berthold aus Aachen

‹ Nach Upgrade 8.9.19 auf Drupal 9 kein Zugriff auf Adminbereich mehr [gelöst] Benutzer erstellen ohne Berechtigung zum ändern von E-Mail oder Passwort ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich würde es auch über eine

Eingetragen von montviso (2189)
am 04.11.2021 - 08:17 Uhr

Ich würde es auch über eine Funktion regeln.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Also mein Tipp wäre, das über

Eingetragen von tobi-berlin (857)
am 04.11.2021 - 15:18 Uhr

Also mein Tipp wäre, das über einen eigenen EvenSubscriber zu machen. Ich nehme an, mit "/home durch /about ersetzen" meinst Du eigentlich "weiterleiten zu"?

Du könntest z.B. in einer service.yml einen Service definieren, der die Klasse CustomPageExceptionHtmlSubscriber extended.

Ich habe das folgender Maßen gemacht. Auf unserer Plattform haben Politiker ein Profil mit mehreren Unterseiten. Diese Profil-Unterseiten werden über "access denied" ausgeblendet, z.B. wenn es für einen Politiker keine Infos über Nebeneinkünfte gibt. Ruft der Politiker nun die Nebeneinkünfte-Unterseite seines Profils auf (was aus diversen Gründen passieren kann), soll er aber keine Access denied Meldung sehen, sollen zur Hauptseite des Profils weitergeleitet werden. So viel nur zum Hintergrund.

In MODULE.services.yml:

  MODULE.exception.politician_profile_subpage:
    class: Drupal\MODULE\EventSubscriber\PoliticianProfileAccessDeniedSubscriber
    tags:
      - { name: event_subscriber }
    arguments: ['@config.factory', '@http_kernel', '@logger.channel.php', '@redirect.destination', '@router.no_access_checks', '@access_manager', '@current_route_match']

Die Klasse dazu:

namespace Drupal\MODULE\EventSubscriber;

use Drupal\MODULE\PoliticianSubpageManager;
use Drupal\Core\Access\AccessManagerInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\EventSubscriber\CustomPageExceptionHtmlSubscriber;
use Drupal\Core\Routing\CurrentRouteMatch;
use Drupal\Core\Routing\RedirectDestinationInterface;
use Drupal\Core\Url;
use Drupal\MODULE\Entity\Politician;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;

/**
* Exception subscriber for handling 403 access denied error on politician
* profile subpages in order to redirect to the main profile page
*/
class PoliticianProfileAccessDeniedSubscriber extends CustomPageExceptionHtmlSubscriber {

  /**
   * @var \Drupal\Core\Routing\CurrentRouteMatch
   */
  protected $currentRouteMatch;

  public function __construct(ConfigFactoryInterface $config_factory, HttpKernelInterface $http_kernel, LoggerInterface $logger, RedirectDestinationInterface $redirect_destination, UrlMatcherInterface $access_unaware_router, AccessManagerInterface $access_manager, CurrentRouteMatch $currentRouteMatch) {
    parent::__construct($config_factory, $http_kernel, $logger, $redirect_destination, $access_unaware_router, $access_manager);
    $this->currentRouteMatch = $currentRouteMatch;
  }

  /**
   * Handles a 403 error for HTML.
   *
   * @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
   *   The event to process.
   */
  public function on403(ExceptionEvent $event) {
    if (PoliticianSubpageManager::isProfileSubpage($this->currentRouteMatch->getRouteName())) {
      $politician = $this->getPolitician();
      if ($politician) {
        $redirectResponse = new RedirectResponse(Url::fromRoute('entity.politician.canonical', ['politician' => $politician->id()])->toString());
        $event->setResponse($redirectResponse);
      }
    }
    else {
      parent::on403($event);
    }
  }

  /**
   * @return \Drupal\MODULE\Entity\Politician|null
   */
  protected function getPolitician(): ?Politician {
    $politician = $this->currentRouteMatch->getParameter('politician');
    if ($politician instanceof Politician) {
      return $politician;
    }
    elseif (is_numeric($politician)) {
      return Politician::load($politician);
    }

    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  protected static function getPriority() {
    return 100;
  }
}

Für Dich wichtig ist die on403() Methode... hier müsstest Du nur prüfen, welche Route gerade aufgerufen wurde (bei Dir wohl die Route für /home) und dann zur Route für /about weiterleiten.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das ist sehr interessant. Ich

Eingetragen von torfnase (1525)
am 04.11.2021 - 19:16 Uhr

Das ist sehr interessant.
Ich werde mir das mal ganz genau anschauen.
In der Tat meinte ich mit /home / about ersetzen, weiterleiten, also ein Ersetzen in der URL :-)
(ungeschickte Ausdrucksweise von mir)

Ich habe es jetzt erst mal über die preprocess_page Funktion geregelt.
Dazu habe ich die $_SERVER["REQUEST_URI"] ausgewertet und entsprechend meinen Bedürfnissen mit einem header-Befehl auf die "richtige" Seite weitergeleitet.

Was ist der Vorteil von Deiner Methode, die zweifelsohne sehr viel aufwendiger scheint ?

Gruß Berthold aus Aachen

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • gepatchte PHP Version 7.4 für Windows
  • Canvas Palette: Eine fertige Komponentenbibliothek für Drupal Canvas
  • Hilfe zu Updates oder Composer
  • Vergleich Drupal und Contao
  • [geloest] Blocks in Bootstrap nebeneinander darstellen und nicht untereinander
  • DrupalCamp Frankfurt 27-28 November 2026
  • Bitte mein Bentzerkonto löschen
  • Beim Aufruf einiger Inhalte erhalte ich folgende Fehlermeldung
  • Neuinstallation: vermutlich ein rewrite-Problem
  • Drupal CMS installieren
  • [erledigt]MP3 in Drupal 10 einbinden
  • (gelöst)Drupal 11 installieren
Weiter

Neue Kommentare

  • Muss ja nicht genau php 8.3 sein
    vor 1 Woche 11 Stunden
  • Guten morgen und Danke
    vor 1 Woche 18 Stunden
  • Evtl. versuchen auf PHP 8 zu wechseln
    vor 1 Woche 1 Tag
  • Danke Schmittrich. Die Frage
    vor 1 Woche 2 Tagen
  • Keine Antwort auf die Frage nach dem Woher
    vor 1 Woche 2 Tagen
  • Danke ich werde mir die
    vor 7 Wochen 11 Stunden
  • Vielen Dank für Ihren
    vor 7 Wochen 3 Tagen
  • Composer ist sehr ratsam
    vor 7 Wochen 5 Tagen
  • Vielen Dank für den
    vor 8 Wochen 15 Stunden
  • Die alten CMS Vergleiche von contentmanager.de
    vor 8 Wochen 1 Tag

Statistik

Beiträge im Forum: 250323
Registrierte User: 20573

Neue User:

  • alxshell
  • AnthonyhoF
  • Philiphelve

» Alle User anzeigen

User nach Punkten sortiert:
wla9466
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 20 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association