Soucis de redirection

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour bonjour!

Après quelques recherches sur le net à droite à gauche via google, la documentation officielle, le site du zéro, et j'en passe, je viens vous trouver en espérant que vous aurez la réponse à ma question.

Bref, je vous expose directement ce qui m'amène: j'ai un soucis de redirection! Si si, je vous assure :p !

Voici un bout de code qui s'exécute au submit de mon formulaire:

<?php
function training_form_submit($form, &$form_state){
  
$node = node_form_submit_build_node($form, $form_state); // create the node
 
$node->status = FALSE; // we want it not to be published!
  
   // get the values and save it (update or insert)
  
switch($node->type){
        case
'training':
        
$node->title = $form_state['values']['title'];
         
$node->body = $form_state['values']['body'];
           
$node->goals = $form_state['values']['goals'];
         
$node->public = $form_state['values']['public'];
           
$node->global_cost = $form_state['values']['global_cost'];
         
$node->select = $form_state['values']['tid'];
          
node_save($node);
         
          
variable_set('training_id', $node->nid); // save the training id
     
break;
     case
'instance':
        
$node->location = $form_state['values']['location'];
           
$node->trainer = $form_state['values']['trainer'];
         
$node->max_places = $form_state['values']['max_places'];
           
$node->periods = $form_state['values']['periods'];
         
$node->fid = $form_state['values']['fid'];
         
node_save($node);
         
          
variable_set('training_id', $node->fid); // save the training id
     
break;
   }
   
  
drupal_redirect_form($form, 'node/add/instance'); // redirect user
}

?>

J'ai tenté le coup avec une autre instruction (drupal_goto) mais l'effet est le même ; à la création de mon noeud, la redirection s'effectue correctement tandis qu'à l'édition du dit noeud, l'utilisateur est redirigé sur la page de listing des noeuds existants et non sur la page souhaitée (en l'occurrence, 'node/add/instance').

Bref, une idée pour que l'utilisateur soit bien redirigé vers la page souhaitée à l'édition du noeud?

Merci d'avance :) .

Forum : 
Version de Drupal : 

Le drupal_redirect_form utilise au final un drupal_goto si tu n'as pas de champ #redirect dans ton formulaire.

Ce que je vérifierais (désolé je n'ai pas de solution) :
1/ Vérifier que tu n'as pas de #redirect dans ton formulaire au moment du submit en rajoutant un

<?php
 var_dump
($form); exit();
?>

avant ta redirection.

2/ je dumperais bien aussi $_SESSION au cas où (sans grande conviction).

3/ tenter un drupal_goto mais avec une URL en absolute ? (encore moins de conviction).

Pour ce qui est du drupal_goto avec une URL en absolute, je l'avais déjà testé mais sans succès malheureusement.

J'ai dumpé selon tes propositions. Dans le formulaire, il n'y a aucun #redirect de présent, $_SESSION est pratiquement vide.

J'ai donc tenté le coup en ajoutant le #redirect dans le formulaire en question mais sans succès ; il continue de me rediriger vers la mauvaise page.
J'ai également tenté en ajoutant le redirect dans $form_state mais sans succès ici aussi.
Ensuite, j'ai tenté le coup en mettant ces champs à NULL. Sans succès.

Le plus étrange c'est que si je ne fais pas de node_save, alors la redirection s'effectue correctement...

Une autre idée?

Dans tous les cas, merci pour ta réponse.

C'est bon, j'ai trouvé la solution! J'ai passé mon temps à analyser le code de la fonction drupal_goto et j'ai compris pourquoi il ne redirigais pas vers la page que je voulais...

Pour ceux que ca intéresserait, voici deux solutions possibles:

En fait, il faut prendre en compte la superglobal $_REQUEST qui contient la destination de la requête HTTP courante. Du coup bah si on ne modifie pas cette requête, le système prend ce qu'elle y trouve en "[destination]" ou "[edit][destination]" et n'accorde plus vraiment d'importance au path spécifié (ce qui est une belle erreur je trouve...).
Donc, en modifiant directement $_REQUEST (c'est assez immonde comme pratique mais bon) pour y mettre l'url de la page souhaitée, on contourne le problème. Ce qui donne:

<?php
$mon_path
= url('mon/chemin/vers/ma/page');
$_REQUEST['destination'] = $mon_path;
drupal_goto($mon_path);
?>

J'ai tenté en enlevant le drupal_goto mais il est nécessaire sinon aucune redirection ne se fait (ce qui est logique vu que, au final, aucun header n'est lancé).

Une autre solution, plus simple et un peu plus propre consiste à directement utiliser la fonction header:

<?php
header
('Location: '.$mon_url, TRUE, HTTP_RESPONSE);
exit;
?>

où HTTP_RESPONSE vaut 302, la valeur par défaut que la fonction drupal_goto utilise (si si, drupal_goto fait un header!) et TRUE indique que l'on souhaite écraser la précédente requête de redirection.

Voila, au final rien de bien méchant mais il fallait y penser...