Rediriger un utilisateur après avoir créé un noeud

Super ! Le nouvel article que l’on veut publier avec un sondage lié est maintenant terminé, avant de le mettre en ligne il ne reste plus qu’à créer ce sondage. Purée qu’est ce que c’est coûteux en clics de devoir systématiquement créer l’article et ensuite devoir cliquer partout pour aller sur la page de création de sondages… J’aimerais bien que mon équipe de production fasse en sorte que je sois redirigé directement vers la création de sondage après avoir créé mes articles.

Vos désirs sont des ordres ! Petit tour de magie très simple pour accomplir une telle action.

Dans un premier temps il nous faut ajouter une fonction de traitement à exécuter lorsque le formulaire de création de node est soumis.

/**
 * Implementation of hook_form_alter().
 * Ajouter une fonction qui redirige l'utilisateur automatiquement
 * vers le formulaire de création de contenu d'un autre type mon utilisateur
 */
function MONMODULE_form_alter(&$form, &$form_state, $form_id) {
 // Ajouter notre fonction si le formulaire est un formulaire
 // de création de noeud et si le type de contenu créé est un article
 if ($form["#id"] == 'node-form' && $form["type"]["#value"] == "story") {
  $form["#submit"][] = 'MONMODULE_create_submit';
 }
}

Notre fonction est déclarée auprès du formulaire de création de noeud, il ne reste plus qu’à implémenter cette fonction qui va faire la redirection.

/**
 *  Rediriger vers le formulaire de création de sondages
 */
function MONMODULE_create_submit($form, &$form_state) {
 $_REQUEST['destination'] = 'node/add/webform';
}

Et le tour est joué ! C’est aussi simple que ça.
Un peu d’explications, pour faire une redirection depuis un formulaire il existe plusieurs méthodes.

drupal_goto()

Cette fonction permet de faire des redirections depuis Drupal vers des URLs internes ou externes en passant une série de paramètres. Le seul détail qui fâche c’est que drupal_goto() stoppe complètement l’exécution du script en effectuant la redirection. Si un traitement devait se faire après l’exécution de votre fonction vous pouvez faire une croix dessus.

$form[‘#redirect’]

Cette méthode permet d’ajouter une redirection après le traitement du formulaire, cette technique peut être utilisée à la création du formulaire ou depuis un hook_form_alter(). Si vous ne pouvez travailler que dans une fonction supplémentaire au moment de la soumission du formulaire cette technique ne peut être employée. Si la fonction de soumission du formulaire exécutée par defaut définie une autre valeur pour $form[‘#redirect’] votre valeur sera ecrasée.

$form_state[‘redirect’]

Cette fois, si vous ne pouvez travailler que dans une fonction supplémentaire à la soumission du formulaire cette technique fonctionne, vous écrasez la valeur définie dans $form[‘#redirect’] pour renvoyer l’utilisateur là où vous l’avez décidé à la fin du traitement de votre fonction. Cette technique ne fonctionne en revanche pas lorsque le formulaire que vous modifiez est le formulaire de création de noeud.

$_REQUEST[‘destination’]

Pourquoi devoir employer cette méthode ? Il faut savoir qu’à la création d’un noeud la dernière fonction appelée est toujours node_form_submit(). Cette fonction fixe la valeur de $form_state[‘redirect’] à node/NID pour rediriger l’utilisateur vers le noeud qui vient d’être créé. La seule façon propre de détourner cette action est donc de recourir à $_REQUEST qui est l’unique option de passer outre les valeurs définies dans $form et $form_state.

8 thoughts on “Rediriger un utilisateur après avoir créé un noeud

  1. Cela est sans aucun doute possible avec les déclencheurs et les actions sans une ligne de code.

  2. Merci pour ce billet :).

    Sur un formulaire qui ne fait que envoyé des paramètre à une view j’ai testé $form_alter[‘redirect’] dans la fonction de submit mais sans succès.

    La solution qui fonctionne pour moi est d’utiliser $form_state[‘redirect’].

    function filter_by_geo_block_form_submit($form, &$form_state) {
      if(isset($form_state['values']['#geocode'])) {
        $geocode = $form_state['values']['#geocode'];
        $user_geotarget['lon'] = $geocode->point['lon'];
        $user_geotarget['lat'] = $geocode->point['lat'];
        $user_geotarget['name'] = check_plain($form_state['values']['geo_filter']);
        filter_by_geo_set_user_geotarget($user_geotarget);
        $arg = 'geo[target][lat]=' . urlencode($user_geotarget['lat']) . '&geo[target][lon]=' . urlencode($user_geotarget['lon']);
        $form_state['redirect'] = array('events_search/' . $user_geotarget['name'],$arg);
      }
    }
    
  3. Exact Gagarine, il y a une erreur dans le billet, c’est corrigé. Il s’agit bien de $form_state[‘redirect’] et non de form_alter (qui n’existe pas)

  4. Ca implique de modifier tous les liens qui pointent vers node/add/TYPE mais ta solution fonctionne également, lorsque l’on utilise $_REQUEST on ne fait ni plus ni moins la même chose que ce que tu proposes à savoir rajouter un paramètre dans l’URL destination qui pointe vers REDIRECTION.
    $_REQUEST est un agglomérat de $_POST et $_GET en fait.

  5. En Drupal7, modifier $_REQUEST ne fonctionnait pas, j’ai du modifier directement $_GET[‘destination’], pour info.

Comments are closed.