web-dev-qa-db-ja.com

宛先パラメータが設定されていても、送信ハンドラでリダイレクトを強制する

カスタムサブミットハンドラー を追加し、フォームがサブミットされた後にカスタムルートにリダイレクトしたい。

これは私が使ったものです

use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;
use \Drupal\Core\Url;

function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {

    if ($form_id == 'node_trends_form' || $form_id == 'node_trends_edit_form') {

        foreach (array_keys($form['actions']) as $action) {
            if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
                $form['actions'][$action]['#submit'][] = 'zyetondev_sync_trends_submit';
            }
        }
    }
}


function zyetondev_sync_trends_submit(array $form, FormStateInterface $form_state) {
    $url = Url::fromRoute('view.trends.page_1');
//    die(Url::fromRoute('view.trends.page_1')->toString());
    drupal_set_message("Done");
    $form_state->setRedirect($url);
}

サブミットハンドラーが実行され、リダイレクトリダイレクトが正しく機能します問題はいつですか?destination= on URL、?destination=はURLにありますか?

8
Yusef

これを行う唯一の正しい方法は、Requestオブジェクトを変更して宛先を削除することです。

送信コールバックで:

\Drupal::request()->query->remove('destination');

コンテキストによっては、どこかに保存したい場合があります。たとえば、リダイレクト先のURLに渡して、後で再び尊重されるようにします。

宛先が指定されている場合にプレビューボタンを修正するためにこれを正確に実行しているコアの問題については、 https://www.drupal.org/node/232546 を参照してください。

13
Berdir

このコードはあなたを助けます。

 $url = \Drupal\Core\Url::fromRoute(
        'node.add',
         array('node_type' => $type->id()),
         array(
           'query' => array('destination' => $destination),
           'absolute' => TRUE,
         )
    );
   $form_state->setRedirect($url);
1