Erzwingen Sie die Umleitung im Submit-Handler, obwohl der Zielparametersatz festgelegt ist

9

Ich füge einen benutzerdefinierten Übermittlungs-Handler hinzu und möchte nun nach dem Senden des Formulars zur benutzerdefinierten Route umleiten.

Das habe ich benutzt

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);
}

Submit Handler wird ausgeführt und die Umleitung funktioniert korrekt. Das Problem ist, wenn wir die ?destination=URL verwenden. Wie kann ich die Weiterleitung erzwingen, obwohl die ?destination=URL aktiviert ist?

Yuseferi
quelle
Wenn ich Ihre Anforderung richtig verstanden habe, möchten Sie bei der Umleitung auch Abfrageparameter einbeziehen? Korrigieren Sie mich, wenn Sie falsch liegen.
Yogesh
@Yogesh Nehmen wir an, Sie befinden sich in / admin / content. Wenn Sie versuchen, einen ?destination=/admin/contentzur URL hinzugefügten Knoten zu bearbeiten , möchte ich meinen benutzerdefinierten Pfad umleiten, obwohl er ?destination=in der URL vorhanden ist.
Yuseferi

Antworten:

14

Der einzig richtige Weg, dies zu tun, besteht darin, das Anforderungsobjekt zu ändern und das Ziel zu löschen.

In Ihrem Rückruf:

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

Je nach Kontext möchten Sie es möglicherweise irgendwo speichern, z. B. an die URL weiterleiten, an die Sie umleiten, damit es später erneut berücksichtigt wird.

Unter https://www.drupal.org/node/2325463 finden Sie ein Kernproblem, das genau dies bewirkt, um die Vorschau-Schaltfläche zu beheben, wenn ein Ziel angegeben wird.

Berdir
quelle
1

Dieser Code wird Ihnen helfen.

 $url = \Drupal\Core\Url::fromRoute(
        'node.add',
         array('node_type' => $type->id()),
         array(
           'query' => array('destination' => $destination),
           'absolute' => TRUE,
         )
    );
   $form_state->setRedirect($url);
Atikrant Upadhye
quelle
Der angezeigte Code würde Benutzer nicht einmal umleiten. Es wird lediglich ein URL-Objekt erstellt, das selbst keine Umleitung durchführt.
Kiamlaluno