web-dev-qa-db-ja.com

送信後に表示するノードフォームをリダイレクトする

パスとして「work」を使用するDrupal 8サイトのビューがあります。ノードが送信された直後にユーザーをこのパスにリダイレクトしたいと思います。

Drupal 7にあったように、フォームの変更は適切な解決策のようですが、以前よりも複雑です。Drupal 7では、直接パスとリダイレクトが行われました。ここでは、もはや明白ではないルート名を指定する必要があります。適切なルート名の値を見つけるにはどうすればよいですか?ノード、ビュー、カスタムパスなどでは異なります。

$form_state->setRedirect('')の引数として何を使用すればよいですか?さまざまなケースで使用する必要があるルート名を見つけるにはどうすればよいですか?

function work_form_alter(&$form, \Drupal\Core\Form\FormStateInterface\FormStateInterface $form_state, $form_id) {
  switch ($form_id) {
    case 'node_work_form':
      $form['actions']['submit']['#submit'][] = 'work_redirect';
      break;
  }
}

function work_redirect($form, FormStateInterface $form_state) {
  // Set redirect to some path.
  $form_state->setRedirect(''); // What should I provide here as an argument/arguments
}
4
David

ビューの場合、ルートパターンはview.(view_id).(display_id)です。

たとえば、Articlesというビューと、「All」という名前のディスプレイがある場合、次のようになります。

$form_state->setRedirect('view.articles.all');

ディスプレイIDの名前を変更しない場合(通常は変更します)、おそらくpage_1またはその性質の何か。

それを超えて、それは以前の状態に似ています。クエリ文字列引数が添付されたリダイレクトを次に示します。

$form_state->setRedirect('view.articles.all', ['keywords' => $form_state->getValue('keywords')]);
3
Kevin

SetRedirect($ route_name)の代わりに、URLのみを必要とするsetRedirectUrl(Url $ url)メソッドを使用できます。

このメソッドを使用するには、ページの上部でこの名前空間を使用する必要があります。

use Drupal\Core\Url;

リダイレクト関数は次のようになります。

function work_redirect($form, FormStateInterface $form_state) {
  // Path needs to start with / or # or ?
  $redirect_path = "/work";
  $url = url::fromUserInput($redirect_path);
  $form_state->setRedirectUrl($url);
}
0
David