Mam niestandardowy moduł, który wyświetla formularz.
Po przesłaniu formularza chcę przekierować użytkownika na inną stronę.
Jak mogę to zrobić?
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, żedrupal_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']
doFALSE
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ładajax_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 przezdrupal_form_submit()
, więc każde przekierowanie zepsułoby wywoływany skryptdrupal_form_submit()
.$form_state['rebuild'] === TRUE
: oznacza, że formularz musi zostać przebudowany bez przekierowania.źródło
W przypadku Drupala 7 wypróbowałem to na niestandardowym module i działa. Można go również użyć w motywie:
BTW, znalazłem ten fragment tutaj: https://gist.github.com/postrational/5768796
źródło
Aby przekierować na zewnętrzny adres URL w Drupal 8, użyj
TrustedRedirectResponse
klasy, jak w poniższym kodzie.źródło
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):
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:
Mam nadzieję, że to może pomóc
źródło
Dla drupal 7, jeśli chcesz przekierować na adres URL z parametrami takimi jak
someurl?param1=1¶m2=2
źródło