web-dev-qa-db-ja.com

ユーザーをリダイレクトしてメッセージを表示するにはどうすればよいですか?

RedirectResponseでユーザーをリダイレクトしてメッセージを表示したいのですが、メッセージが表示されません。

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

少しデバッグしたところ、最初の(ソース)URLが2回読み込まれ、メッセージ(drupal_set_message()で追加されたもの)がdrupal_get_messages()のセッションから削除されました。したがって、ターゲット_$url_にメッセージがありません。

どうすればこれを達成できますか?

hook_field_widget_form_alter()で実行しています。

5
Eugene

調査の結果、応答の直後にスクリプトを中断する必要があることがわかりました。このアプローチはいくつかの重要なアクションを壊す可能性があるため、このアプローチには十分注意する必要があります。

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

drupal_set_message()のrepeatパラメータをTRUEに設定すると、機能します。

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

これと同じ問題がありましたが、スクリプトを終了するために出口を使用することは良い考えではありません。 Drupalには、ページの読み込みの最後に実行されるシャットダウン機能があり、重要な場合があります。代わりに、リダイレクト応答を直接返す必要がありました。

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

リダイレクト:

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


静的サービスを使用したメッセージ:

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


その他の同等物:

addMessage()addError()addWarning()


参照:

RedirectResponse

RL

Drupal :: messenger

MessengerInterface

2
Vinayak Anivase

解決策は、自分で応答を送信するのではなく、自分の代わりに送信することです。

return $response;
1
Asy

コントローラのコールバック内で私のために働きます。 send()を使用するべきではなく、RedirectResponceオブジェクトを返すだけです。

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

ログアウト機能を再作成します。それは単にuser_logout()関数を呼び出しているだけです。

このために、私は作成します:

SomeControllerのメソッド

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

イベント購読者、KernelEvents::REQUESTにサブスクライブ

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

ルーターサブスクライブ、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

Send()関数を使用しないでください。$ responseを返すだけで機能します。

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