So leiten Sie nach dem Absenden eines Formulars zu einer Seite weiter

24

Ich habe ein benutzerdefiniertes Modul, das ein Formular anzeigt.

Nach dem Absenden des Formulars möchte ich den Benutzer auf eine andere Seite weiterleiten.

Wie kann ich das machen?

Carlos Muñiz
quelle

Antworten:

31

Im Submit-Handler tun Sie dies

Drupal 7:

$form_state['redirect'] = 'url';

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
googletorp
quelle
gibt es eine alternative möglichkeit dies zu tun? Die Formulare, die ich umleiten muss, werden mit einem eigenen # Submit-Handler erstellt (die Submit-Handler befinden sich nicht in meinem benutzerdefinierten Modul), sodass ich keinen Zugriff auf den Code habe.
Carlos Muñiz
@Charlie benutze form_alter um deine eigenen hinzuzufügen.
googletorp
@Charlie , wenn Ihr für hauptsächlich zugänglich durch eine Verbindung ist, setzen Sie einen Zielparameter in der URL: /my-form?destination=node/123.
Tostinni
Ich arbeite nicht an D7, aber ich habe etwas gefunden, das funktioniert. Überprüfen Sie meine Nachricht unten.
Ignacio Segura Postigo
Ich möchte mich nur für die Beantwortung von D7 bedanken und dann fünf Jahre später zurückkehren, um die Antwort für D8 zu aktualisieren. <3
ant
17

Es sollte beachtet werden, dass es mehrere Trigger gibt, die eine Umleitung verhindern können:

  • $form_state['redirect'] === FALSE: Wenn festgelegt, möchte die Form Builder-Funktion oder der Form Validation / Submit-Handler nicht, dass ein Benutzer umgeleitet wird, was bedeutet, dass dieser drupal_goto()nicht aufgerufen wird. Bei den meisten Formularen ist die Umleitungslogik gleich, unabhängig davon, ob sie $form_state['redirect']undefiniert oder falsch ist. Falls es jedoch nicht definiert wurde und die aktuelle Anforderung eine 'Ziel'-Abfragezeichenfolge enthält, drupal_goto()wird es stattdessen zu diesem angegebenen Ziel umgeleitet. Nur die Einstellung $form_state['redirect']auf FALSEverhindert eine Umleitung.
  • $form_state['no_redirect'] === TRUE: Wenn diese Option festgelegt ist, lässt der Rückruf, der ursprünglich das Formular erstellt hat, Umleitungen unabhängig vom Umleitungswert in explizit zu $form_state['redirect']. Beispielsweise ajax_get_form()legt , $form_state['no_redirect']wenn ein Formular in einem AJAX Rückruf Aufbau jede Umleitung zu verhindern. $form_state['no_redirect']sollten NICHT durch Form Builder-Funktionen oder Formularüberprüfungs- / Submit-Handler geändert werden.
  • $form_state['programmed'] === TRUE: bedeutet, dass die Formularübermittlung normalerweise über aufgerufen wurde drupal_form_submit(), sodass bei jeder Umleitung das aufgerufene Skript unterbrochen wird drupal_form_submit().
  • $form_state['rebuild'] === TRUE: bedeutet, dass das Formular ohne Umleitung neu erstellt werden muss.
trampjuice
quelle
7

Für Drupal 7 habe ich dies auf einem benutzerdefinierten Modul versucht und es funktioniert. Es kann auch in einem Thema verwendet werden:

function my_theme_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'contact_site_form') {
$form['#submit'][] = 'contact_form_submit_handler';
}
}

function contact_form_submit_handler(&$form, &$form_state) {
$form_state['redirect'] = 'thank-you-page-alias';
}

Übrigens habe ich dieses Snippet hier gefunden: https://gist.github.com/postrational/5768796

Ignacio Segura Postigo
quelle
4

Verwenden Sie die TrustedRedirectResponseKlasse wie im folgenden Code , um in Drupal 8 zu einer externen URL umzuleiten .

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
quelle
Falls es helfen könnte, müssen wir diese Klasse mit dem useSchlüsselwort und seinem Namespace aufnehmen:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel
2

Auf D8 hat mir das gefallen (aber das wird nicht funktionieren ... siehe unten):

/**
* Implements hook_form_FORM_ID_alter().
*/
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {

   // Force redirect to "/thankyou" page
   $url = "/thankyou";
   $path = \Drupal::service('path.alias_manager')->getPathByAlias($url);
   if(preg_match('/node\/(\d+)/', $path, $matches)) {
     $form_state->setRedirect('entity.node.canonical',
       array('node' => $matches[1])
     );    
   }

}

Bearbeiten/

Mir fehlte, dass setRedirect / setRedirectUrl funktioniert, nachdem das Modul gesendet wurde. Dies ist meine funktionierende Lösung für D8:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function MYMODULE_form_FORM_ID_form_alter( array &$form, FormStateInterface $form_state, $form_id ) {
  $form['actions']['submit']['#submit'][] = 'MYFORM_redirect_handler';
}

function MYFORM_redirect_handler($form, FormStateInterface $form_state) {
  // Force redirect to "/sent"
  $dest_url = "/sent";
  $url = Url::fromUri('internal:' . $dest_url);
  $form_state->setRedirectUrl( $url );
}

Hoffe das könnte helfen

nessunluogo
quelle
1

Für Drupal 7, wenn Sie mit params wie zur URL umleiten möchtensomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
Berramou
quelle