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ć?

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);

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.

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


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);

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


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',
    ),
  );
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.