Jak przekierować na stronę po przesłaniu formularza

24

Mam niestandardowy moduł, który wyświetla formularz.

Po przesłaniu formularza chcę przekierować użytkownika na inną stronę.

Jak mogę to zrobić?

Carlos Muñiz
źródło

Odpowiedzi:

31

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);
googletorp
źródło
czy istnieje alternatywny sposób na zrobienie tego? formularze, które muszę przekierować, są budowane z własnym modułem #submit (moduły wysyłania nie są umieszczane w moim module niestandardowym), więc nie mam dostępu do kodu.
Carlos Muñiz
@Charlie użyj form_alter, aby dodać własny.
googletorp
@Charlie jeśli jest dostępna dla głównie przez link, umieścić parametr docelowy adres URL: /my-form?destination=node/123.
tostinni
Nie działam na D7, ale znalazłem coś, co działa. Sprawdź moją wiadomość poniżej.
Ignacio Segura Postigo,
Chcę tylko podziękować za odpowiedź na D7, a potem wracam 5 lat później, aby zaktualizować odpowiedź na D8. <3
mrówka
17

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 FALSEzapobiegnie 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.
trampjuice
źródło
7

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

Ignacio Segura Postigo
źródło
4

Aby przekierować na zewnętrzny adres URL w Drupal 8, użyj TrustedRedirectResponseklasy, jak w poniższym kodzie.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
źródło
Aby to mogło pomóc, musimy dołączyć tę klasę do usesłowa kluczowego i jego przestrzeni nazw:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel
2

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

nessunluogo
źródło
1

Dla drupal 7, jeśli chcesz przekierować na adres URL z parametrami takimi jaksomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
berramou
źródło