it-swarm.com.de

Wie leite ich Benutzer um und zeige eine Nachricht an?

Ich möchte Benutzer mit RedirectResponse umleiten und eine Nachricht anzeigen, aber die Nachricht wird nicht angezeigt.

$response = new RedirectResponse($url);
$response->send();

Nach einigem Debuggen stellte ich fest, dass meine ursprüngliche (Quell-) URL zweimal geladen wurde und die Nachrichten (hinzugefügt mit drupal_set_message()) aus der Sitzung in drupal_get_messages() entfernt wurden. Ich habe also keine Nachrichten auf meinem Ziel $url.

Wie kann ich das erreichen?

Ich mache es in hook_field_widget_form_alter().

5
Eugene

Nach einigen Nachforschungen habe ich festgestellt, dass ich das Skript direkt nach der Antwort unterbrechen sollte. Sie sollten bei diesem Ansatz sehr vorsichtig sein, da er einige wichtige Aktionen unterbrechen kann.

$response = new RedirectResponse($url->toString());
$response->send();
exit;
1
Eugene

Setzen Sie den Wiederholungsparameter in drupal_set_message() auf TRUE und es funktioniert:

$response = new RedirectResponse($url);
$response->send();
drupal_set_message(t('My message after redirect'), 'status', TRUE);
7
Webdrips

Ich hatte das gleiche Problem, aber es ist keine gute Idee, einen Exit zum Beenden des Skripts zu verwenden. Drupal hat Shutdown-Funktionen, die am Ende eines Seitenladevorgangs ausgeführt werden, was wichtig sein kann. Stattdessen musste ich nur die Umleitungsantwort direkt zurückgeben:

public function buildForm(array $form, FormStateInterface $form_state) {
  $wizard_data = $form_state->getTemporaryValue('wizard');

  if (empty($wizard_data['csv_data'])) {
    drupal_set_message($this->t('Please upload a file first.'), 'error');
    return $this->redirect('my.route')->send();
  }
2
masterchief

Weiterleiten:

// Drupal\Core\Url; // Symfony\Component\HttpFoundation\RedirectResponse; $url = Url::fromUri('internal:/'); $response = new RedirectResponse($url->toString()); $response->send();


Messeges mit statischem Dienst:

\Drupal::messenger()->addStatus($message);


Andere Äquivalente:

addMessage(), addError(), addWarning().


Referenzen:

RedirectResponse

RL

Drupal :: messenger

MessengerInterface

2
Vinayak Anivase

Ich würde sagen, dass die Lösung nicht darin besteht, die Antwort selbst zu senden, sondern in Ihrer Rückkehr.

return $response;
1
Asy

Funktioniert für mich im Controller-Rückruf. Sollte nicht send () verwenden, sondern nur das RedirectResponce-Objekt zurückgeben.

drupal_set_message(t('Please log in or create new account.'));
$url = Url::fromRoute('user.login');
$response = new RedirectResponse($url->toString());
return $response;

Erstellen Sie die Abmeldefunktion neu. Es ruft nur die Funktion user_logout() auf.

Dafür erstelle ich:

Eine Methode in SomeController

public function logout() {
  user_logout();
  return $this->redirect('<front>', [], ['query' => ['logout' => 1]]);
}

Ein Ereignisabonnent, abonniere KernelEvents::REQUEST

$queryLogout = \Drupal::request()->query->get('logout');
if (!empty($queryLogout) && $queryLogout == 1) {
  drupal_set_message("You are logged out");
}

Ein Router-Abonnent, der den Controller der user.logout-Route ändert

protected function alterRoutes(RouteCollection $collection) {

  // Change controller who handle logout.
  if ($routeLogout = $collection->get('user.logout')) {
    $routeLogout->setDefault('_controller', '\Drupal\my_module\Controller\SomeController::logout');
  }
}
0
Permana

Verwenden Sie nicht die Funktion send (), sondern geben Sie nur $ response zurück, und es funktioniert.

$response = new RedirectResponse(\Drupal::url('user.login'));
// $response->send();
return $response;
0
Sudharshan