it-swarm.com.de

Wie soll ich eine Umleitung in hook_form_alter () durchführen?

Wenn Benutzer sich anmelden, möchte ich sie auf eine andere Seite umleiten, wenn sie eine bestimmte Rolle haben. In Drupal 7) würde ich drupal_goto() in hook_user_login() verwenden, um die Umleitung durchzuführen, und hook_module_implements_alter(), um sicherzustellen, dass meine Modul ist das letzte in der Liste, so dass alles andere eine Chance bekommt, ausgeführt zu werden.

In Drupal 8) scheint das Durchführen einer Umleitung außerhalb eines Controllers kein unterstützter Anwendungsfall zu sein.

Auf dieser Seite hat gngn das gleiche Problem und generiert manuell eine RedirectResponse und sendet sie.

Das Problem ist, dass send() aus meiner Sicht die Anforderung nicht beendet und die Seite zwei HTML-Dokumente enthält: eine Seite "Weiterleiten an ...", gefolgt von einer beliebigen Seite, die dort gewesen wäre an erster Stelle. Welches könnte ein Sicherheitsproblem sein.

johnvb merkt dies und fügt nach exit() einen Aufruf von send() ein.

Vermutlich wird im Aufruf $kernel->terminate() in index.php etwas Nützliches getan, das durch Aufrufen von exit() umgangen wird.

In Drupal 7, drupal_goto() hat drupal_exit() aufgerufen, um dieses Problem zu lösen.

drupal_goto() wurde entfernt sagt, dass Module, die den Anforderungsfluss unterbrechen müssen, eine HTTP-Ausnahme auslösen sollten, aber es gibt keine 'Redirect'-Ausnahmen.

Da die Benutzeranmeldung auch eine Umleitung durchführt, besteht ein anderer Ansatz darin, die Umleitungs-URL zu ändern, wie unter dem obigen Link drupal_goto() change record vorgeschlagen. Dieser Ansatz führt jedoch dazu, dass meine Methode bei jeder einzelnen Anfrage aufgerufen wird, was für das, was ich tue, wahnsinnig verschwenderisch erscheint.

Wie soll ich also eine Umleitung von hook_form_alter() in Drupal 8) durchführen?

2
Claw
use Drupal\Core\Form\FormStateInterface;

/** 
 * Implements hook_form_FORM_ID_alter().
 */
function [MODULENAME]_form_user_login_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  // Alter login form and add own custom submit handler.
  $form['#submit'][] = '_[MODULENAME]_user_login_form_submit';

  // Not all forms pay attention to $form['#submit'][]. For these
  // try adding your submit hook to the #submit for the specific
  // button.  e.g.,
  $form['actions']['submit']['#submit'][] = '_[MODULENAME]_user_login_form_submit';
}

/**
 * Custom submit handler for login form.
 */
function _[MODULENAME]_user_login_form_submit($form, FormStateInterface $form_state) {
  // Set redirect to login form.
  $form_state->setRedirect('custom.redirect_callback');
}
5
harsh_behl_0007

Sie haben verschiedene Möglichkeiten, den Benutzer nach der Anmeldung umzuleiten. Wie in den vorherigen Antworten können Sie dies tun, indem Sie hook_form_FORM_ID_alter () implementieren und eine zusätzliche Übermittlungsfunktion hinzufügen. Sie können jedoch auch die Funktion hook_user_login verwenden:

So leiten Sie mit Parametern, die eine URL generieren, zu einer Route um (mithilfe der Symfony\Component\Validator\Constraints\Url-Klasse Referenz ):

$form_state->setRedirectUrl(new Url('route_name', ['route' => 'parameters'])); 

So leiten Sie zu einer Route um:

$form_state->setRedirect('route_name', ['route' => 'parameters']);

Sie können auch Symfony\Component\HttpFoundation\RedirectResponse Verwenden, wenn Sie beispielsweise einen Benutzer auf eine benutzerdefinierte Benutzerseite umleiten möchten:

function your_module_user_login($account) {
    global $base_url;
    $redirect = new RedirectResponse($base_url .'/your-url/'.$account->uid->value);
    $redirect->send();

}
0
Andrew Nim

Die richtige Methode zum Festlegen einer Umleitung nach dem Senden eines Formulars in Drupal 8) besteht in den folgenden Schritten.

Die Alternative wäre die Verwendung des Dienstes redirect.destination . In diesem Fall wäre es auch mit Drupal 8) möglich, hook_user_login() zu verwenden.

function mymodule_user_login(UserInterface $account) {
  \Drupal::destination()->set($url_destination_as_string);
}

Die Dokumentation für RedirectDestination::set() sagt jedoch:

Diese Methode sollte sehr selten verwendet werden, z. B. wird sie von Ansichten verwendet, um alle Zielaufrufe in ihrem gesamten Rendering zu überschreiben.

Nebenbei bemerkt, die richtige Methode zum Umleiten von Benutzern nach dem Anmelden in Drupal 7) verwendet Code ähnlich dem folgenden.

function mymodule_user_login(&$edit, $account) {
  $edit['redirect'] = $path_to_redirect_users_to;
}

Dies funktioniert, weil der Parameter &$edit, Den der Hook empfängt, der Parameter $form_state Ist, der an den Übermittler für die Übermittlung des Anmeldeformulars übergeben wird.

function user_login_submit($form, &$form_state) {
  global $user;
  $user = user_load($form_state['uid']);
  $form_state['redirect'] = 'user/' . $user->uid;
  user_login_finalize($form_state);
}

function user_login_finalize(&$edit = array()) {
  global $user;
  watchdog('user', 'Session opened for %name.', array(
    '%name' => $user->name,
  ));

  // Update the user table timestamp noting user has logged in.
  // This is also used to invalidate one-time login links.
  $user->login = REQUEST_TIME;
  db_update('users')
    ->fields(array(
    'login' => $user->login,
  ))
    ->condition('uid', $user->uid)
    ->execute();

  // Regenerate the session ID to prevent against session fixation attacks.
  // This is called before hook_user in case one of those functions fails
  // or incorrectly does a redirect which would leave the old session in place.
  drupal_session_regenerate();
  user_module_invoke('login', $edit, $user);
}
0
kiamlaluno