it-swarm.com.de

Wie kann ich einen Benutzer nach dem Anmelden auf der aktuellen Seite umleiten?

Ich habe eine Drupal 8 Site). Und ich habe ungefähr 5 Seiten auf einer Site.

Wenn ein Benutzer beispielsweise auf der Kontaktseite auf "Anmelden" klickt, sollte der Benutzer nirgendwo umleiten, sondern auf derselben Seite bleiben. Wie kann ich das erreichen?

2
amit joshi

Um dies zu lösen, können Sie den Parameter destination zum Anmeldelink hinzufügen.

Immer wenn der Benutzer auf einer Seite navigiert, aktualisieren Sie das Ziel basierend auf der aktuellen Seite.

Dies kann durch Implementieren des hook_link_alter wie folgt erfolgen:

/**
 * Implements hook_link_alter().
 */
function custom_link_alter(&$variables) {
  $routes = [
    'user.login',
    'user.logout',
  ];
  /* @var Drupal\Core\Url $url */
  $url = $variables['url'];

  if (!$url->isExternal() && $url->isRouted() && in_array($url->getRouteName(), $routes)) {
    // Get current path.
    $current = \Drupal::service('path.current')->getPath();
    $variables['options']['query']['destination'] = $current;
  }
}

Dies funktioniert gut für die Anmeldung und auch für Abmeldelinks. Wenn sich der Benutzer über einen Menülink anmeldet oder abmeldet, wird er zur vorherigen Seite weitergeleitet.

Ein Problem, mit dem Sie möglicherweise konfrontiert werden, ist der Cache. Drupal beginnt mit dem Zwischenspeichern des Zielwerts und wird nicht aktualisiert, wenn Sie zwischen den Seiten wechseln.

Sie können dieses Problem lösen, indem Sie hook_preprocess_menu und Ziel als Cache-Kontexte hinzufügen.

/**
 * Implements hook_preprocess_HOOK().
 */
function custom_preprocess_menu(&$variables) {
  if ($variables['menu_name'] == 'account') {
    $variables['#cache']['contexts'][] = 'url.query_args:destination';
    $renderer = \Drupal::service('renderer');
    $renderer->addCacheableDependency($variables, \Drupal::service('path.current')->getPath());
  }

}
2
Ziftman