web-dev-qa-db-fra.com

Comment rediriger les utilisateurs et afficher un message?

Je souhaite rediriger les utilisateurs avec RedirectResponse et afficher un message, mais le message ne s'affiche pas.

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

Après un petit débogage, j'ai constaté que mon URL (source) initiale était chargée deux fois et que les messages (ajoutés avec drupal_set_message()) étaient supprimés de la session dans drupal_get_messages(). Je n'ai donc aucun message sur ma cible $url.

Comment puis-je atteindre cet objectif?

Je le fais dans hook_field_widget_form_alter().

5
Eugene

Après quelques recherches, j'ai découvert que je devais interrompre le script juste après la réponse. Vous devez être très prudent avec cette approche, car elle peut casser certaines actions importantes.

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

Réglez le paramètre de répétition dans drupal_set_message() sur VRAI et cela fonctionnera:

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

J'ai eu ce même problème, mais utiliser une sortie pour terminer le script n'est pas une bonne idée. Drupal possède des fonctions d'arrêt qu'il exécute à la fin d'un chargement de page, ce qui peut être important. Au lieu de cela, je devais simplement renvoyer la réponse de redirection directement:

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

Redirection:

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


Messeges utilisant un service statique:

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


Autres équivalents:

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


Références:

RedirectResponse

RL

Drupal :: messenger

MessengerInterface

2
Vinayak Anivase

Je dirais que la solution n'est pas d'envoyer la réponse vous-même mais à votre retour.

return $response;
1
Asy

Fonctionne pour moi dans le rappel du contrôleur. Ne doit pas utiliser send (), mais simplement renvoyer l'objet RedirectResponce.

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

Recréez la fonctionnalité de déconnexion. Cela appelle simplement la fonction user_logout().

Pour cela, je crée:

ne méthode dans SomeController

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

n abonné à l'événement, abonnez-vous à KernelEvents::REQUEST

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

n abonné routeur, modifiant le contrôleur de la route user.logout

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

N'utilisez pas la fonction send (), renvoyez simplement $ response et cela fonctionne.

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