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?
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?
Réponses:
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);
/my-form?destination=node/123
.
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 FALSE
empê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.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
Pour rediriger vers une URL externe dans Drupal 8, utilisez la TrustedRedirectResponse
classe, comme dans le code suivant.
$response = new TrustedRedirectResponse('http://google.co.in');
$form_state->setResponse($response);
use
mot - clé et son espace de noms:use Drupal\Core\Routing\TrustedRedirectResponse;
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