Mam niestandardowy moduł, który wyświetla formularz.
Po przesłaniu formularza chcę przekierować użytkownika na inną stronę.
Jak mogę to zrobić?
Mam niestandardowy moduł, który wyświetla formularz.
Po przesłaniu formularza chcę przekierować użytkownika na inną stronę.
Jak mogę to zrobić?
Odpowiedzi:
W module obsługi przesyłania robisz
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
.
Należy zauważyć, że istnieje kilka wyzwalaczy, które mogą zapobiec przekierowaniu:
$form_state['redirect'] === FALSE
: Jeśli jest ustawiony, funkcja konstruktora formularzy lub moduł sprawdzania poprawności / przesyłania formularza nie chce przekierowywać użytkownika, co oznacza, że drupal_goto()
nie jest wywoływany. W przypadku większości formularzy logika przekierowań będzie taka sama, niezależnie od tego, czy $form_state['redirect']
jest niezdefiniowana, czy FALSE. Jednak w przypadku, gdy nie został zdefiniowany, a bieżące żądanie zawiera ciąg zapytania „docelowy”, drupal_goto()
przekieruje do tego podanego miejsca docelowego. Tylko ustawienie $form_state['redirect']
do FALSE
zapobiegnie przekierowanie.$form_state['no_redirect'] === TRUE
: Po ustawieniu wywołanie zwrotne, które pierwotnie zbudowało formularz, wyraźnie wyklucza przekierowanie, niezależnie od wartości przekierowania w $form_state['redirect']
. Na przykład ajax_get_form()
określa $form_state['no_redirect']
podczas budowania formularza w wywołaniu zwrotnym AJAX, aby zapobiec przekierowaniu. $form_state['no_redirect']
NIE powinien być zmieniany przez funkcje konstruktora formularzy lub sprawdzania poprawności / wysyłania procedur obsługi.$form_state['programmed'] === TRUE
: oznacza, że przesłanie formularza było zwykle wywoływane przez drupal_form_submit()
, więc każde przekierowanie zepsułoby wywoływany skrypt drupal_form_submit()
.$form_state['rebuild'] === TRUE
: oznacza, że formularz musi zostać przebudowany bez przekierowania.W przypadku Drupala 7 wypróbowałem to na niestandardowym module i działa. Można go również użyć w motywie:
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';
}
BTW, znalazłem ten fragment tutaj: https://gist.github.com/postrational/5768796
Aby przekierować na zewnętrzny adres URL w Drupal 8, użyj TrustedRedirectResponse
klasy, jak w poniższym kodzie.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
słowa kluczowego i jego przestrzeni nazw:use Drupal\Core\Routing\TrustedRedirectResponse;
Na D8 podobało mi się to (ale to nie zadziała ... patrz poniżej):
/**
* 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])
);
}
}
Edytować/
Brakowało mi, aby setRedirect / setRedirectUrl działał PO przesłaniu modułu, więc to jest moje działające rozwiązanie na 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 );
}
Mam nadzieję, że to może pomóc