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?
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?
Antworten:
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);
/my-form?destination=node/123
.
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 FALSE
verhindert 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.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
Verwenden Sie die TrustedRedirectResponse
Klasse wie im folgenden Code , um in Drupal 8 zu einer externen URL umzuleiten .
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
Schlüsselwort und seinem Namespace aufnehmen:use Drupal\Core\Routing\TrustedRedirectResponse;
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