web-dev-qa-db-fra.com

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

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?

24
Carlos Muñiz

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

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

  • $form_state['redirect'] === FALSE: si 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 que drupal_goto() n'est pas invoqué. Pour la plupart des formulaires, la logique de redirection sera la même, que $form_state['redirect'] Soit indéfini ou FAUX. Cependant, si elle n'a pas été définie et que la demande actuelle contient une chaîne de requête "destination", drupal_goto() sera redirigé vers cette destination donnée à la place. Seul le réglage de $form_state['redirect'] Sur FALSE empêchera toute redirection.
  • $form_state['no_redirect'] === TRUE: Lorsqu'il est 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 éviter toute redirection. $form_state['no_redirect'] Ne doit PAS être modifié par fonctions de création de formulaire ou validation de formulaire/gestionnaires de soumission.
  • $form_state['programmed'] === TRUE: signifie que la soumission du formulaire était généralement invoquée via drupal_form_submit(), donc toute redirection briserait le script qui invoquait drupal_form_submit().
  • $form_state['rebuild'] === TRUE: signifie que le formulaire doit être reconstruit sans redirection.
17
trampjuice

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

7

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

$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
4
DRUPWAY

Sur D8 j'ai aimé ça (mais ça ne marchera 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])
     );    
   }

}

Éditer/

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

2
nessunluogo

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

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