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


9

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

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

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= URL を使用している場合です。URL を使用している場合でも、リダイレクトを強制するにどうすればよい?destination=ですか?


要件を正しく理解した場合、リダイレクト中にクエリパラメータも含めたいですか?間違っていれば私を訂正してください。
Yogesh

@Yogeshが/ admin / contentにいるとします。URLに?destination=/admin/content追加されたノードを編集しようと?destination=すると、URLに存在している場合でもカスタムパスをリダイレクトしたいと思います。
ユセフェリ2016

回答:


14

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

送信コールバックで:

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

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

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


1

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

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

表示しているコードは、ユーザーをリダイレクトすることさえしません。それ自体がリダイレクトを行わないURLオブジェクトを作成するだけです。
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.