Comment rediriger vers une page après avoir soumis un formulaire

24

J'ai un module personnalisé qui affiche un formulaire.

En soumettant le formulaire, je souhaite rediriger l'utilisateur vers une autre page.

Comment puis je faire ça?

Carlos Muñiz
la source

Réponses:

31

Dans le gestionnaire de soumission, vous faites

Drupal 7:

$form_state['redirect'] = 'url';

Drupal 8:

$form_state->setRedirect('route', $args, $options);
$form_state->setRedirectUrl(\Drupal\Core\Url);
googletorp
la source
existe-t-il une autre façon de procéder? les formulaires que je dois rediriger sont construits avec son propre gestionnaire #submit (les gestionnaires de soumission ne sont pas placés dans mon module personnalisé), donc je n'ai pas accès au code.
Carlos Muñiz
@Charlie utilise form_alter pour ajouter le vôtre.
googletorp
@Charlie si votre pour est principalement accessible par un lien, mettez un paramètre de destination dans l'URL: /my-form?destination=node/123.
tostinni
Ne fonctionne pas sur D7, mais j'ai trouvé quelque chose qui fonctionne. Consultez mon message ci-dessous.
Ignacio Segura Postigo
Je veux juste dire merci d'avoir répondu pour D7, puis de revenir 5 ans plus tard pour mettre à jour la réponse pour D8. <3
fourmi
17

Il convient de noter qu'il existe plusieurs déclencheurs qui peuvent empêcher une redirection:

  • $form_state['redirect'] === FALSE: S'il est défini, la fonction de création de formulaire ou le gestionnaire de validation / soumission de formulaire ne souhaite pas qu'un utilisateur soit redirigé, ce qui signifie qu'il drupal_goto()n'est pas appelé. Pour la plupart des formulaires, la logique de redirection sera la même, qu'elle $form_state['redirect']soit indéfinie ou FAUX. Cependant, si elle n'a pas été définie et que la demande actuelle contient une chaîne de requête «destination», elle drupal_goto()sera redirigée vers cette destination donnée à la place. Seul le réglage $form_state['redirect']sur FALSEempêchera toute redirection.
  • $form_state['no_redirect'] === TRUE: Une fois défini, le rappel qui a initialement créé le formulaire interdit explicitement toute redirection, quelle que soit la valeur de redirection dans $form_state['redirect']. Par exemple, ajax_get_form()définit $form_state['no_redirect']lors de la création d'un formulaire dans un rappel AJAX pour empêcher toute redirection. $form_state['no_redirect']ne doit PAS être modifié par les fonctions de création de formulaire ou les gestionnaires de validation / soumission de formulaire.
  • $form_state['programmed'] === TRUE: signifie que la soumission du formulaire était généralement invoquée via drupal_form_submit(), donc toute redirection romprait le script invoqué drupal_form_submit().
  • $form_state['rebuild'] === TRUE: signifie que le formulaire doit être reconstruit sans redirection.
trampjuice
la source
7

Pour Drupal 7, j'ai essayé cela sur un module personnalisé et cela fonctionne. Il peut également être utilisé dans un thème:

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, j'ai trouvé cet extrait ici: https://gist.github.com/postrational/5768796

Ignacio Segura Postigo
la source
4

Pour rediriger vers une URL externe dans Drupal 8, utilisez la TrustedRedirectResponseclasse, comme dans le code suivant.

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
DRUPWAY
la source
Au cas où cela pourrait aider, nous devons inclure cette classe avec le usemot - clé et son espace de noms:use Drupal\Core\Routing\TrustedRedirectResponse;
Sébastien Gicquel
2

Le D8, j'ai aimé ça (mais cela ne fonctionnera pas ... voir ci-dessous):

/**
* 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])
     );    
   }

}

Modifier/

Il me manquait que setRedirect / setRedirectUrl fonctionne APRÈS la soumission du module, c'est donc ma solution de travail sur 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 );
}

J'espère que cela pourrait aider

nessunluogo
la source
1

Pour drupal 7 si vous souhaitez rediriger vers l'URL avec des paramètres commesomeurl?param1=1&param2=2

$query = array(
  'param1' => '1',
   'param2' => '2',
 );
$form_state['redirect'] = array(
    'someurl',
    array(
      'query'    => $query,
      'fragment' => 'hash_fragment',
    ),
  );
berramou
la source