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

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 2 Tagen 5 Stunden
  • Hey danke
    vor 3 Tagen 18 Minuten
  • Update: jetzt gibt's ein
    vor 3 Tagen 18 Stunden
  • Hallo, im Prinzip habe ich
    vor 1 Woche 1 Tag
  • Da scheint die Terminologie
    vor 1 Woche 1 Tag
  • Kannst doch auch alles direkt
    vor 1 Woche 5 Tagen
  • In der entsprechenden View
    vor 1 Woche 5 Tagen
  • Dazu müsstest Du vermutlich
    vor 1 Woche 5 Tagen
  • gelöst
    vor 4 Wochen 2 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 4 Wochen 3 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20449

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 13 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