Rediriger vers une page personnalisée après l'ajout ou la modification d'un nœud

15

À l'aide de hook_form_alter, comment puis-je rediriger un utilisateur vers une page personnalisée après avoir créé ou modifié un nœud au lieu du nœud qui a été créé ou modifié?

Le code actuel pour hook_form_alter()est le suivant:

function custom_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#id'] == 'custom-node-form') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
  }
}
Citricguy
la source
"Il y a un module pour ça": Node Destination ( drupal.org/project/node_destination ) mais il n'est disponible que pour D6. Peut-être peut-on l'adapter.
Benj

Réponses:

16
function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

Le code redirige le formulaire indépendamment du bouton cliqué pour soumettre le formulaire. Si vous souhaitez rediriger un formulaire uniquement lorsque vous cliquez sur un bouton de soumission spécifique, vous devez utiliser le code suivant.

function custom_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form['#node']->type == 'custom') {
    $form['actions']['submit']['#value'] = t('Add Entry');
    $form['field_custom_email']['und'][0]['value']['#element_validate'] = array('_custom_form_validate_email');
    $form['actions']['submit']['#submit'][] = 'custom_node_submit';
  }
}

function custom_node_submit($form, &$form_state) {
  $form_state['redirect'] = 'choose/your/path';
}

 

  • L'ID du formulaire ne contient pas de tirets. L'ID de formulaire est le nom de la fonction PHP qui génère le formulaire (alias le générateur de formulaire), et une fonction PHP ne peut pas contenir de tirets dans son nom.
  • L'ID de formulaire est transmis aux implémentations de hook_form_alter () , hook_form_BASE_FORM_ID_alter () et hook_form_FORM_ID_alter () . hook_form_FORM_ID_alter()n'en a pas vraiment besoin, car il est appelé pour une forme spécifique, tandis que les deux autres hooks sont invoqués pour plus d'une forme.
  • La première fonction est l'implémentation de hook_form_BASE_FORM_ID_alter () ; dans ce cas, l'ID du formulaire de base est "node_form" qui est le formulaire de base pour le formulaire d'édition de nœud.
  • Le formulaire de modification du nœud contient $form['#node'], qui est l'objet nœud de l'objet en cours de modification; "personnalisé" est l'ID court du type de contenu que vous souhaitez rediriger les utilisateurs une fois qu'ils ont modifié un nœud.
  • La modification $form_state['redirect']de hook_form_alter()n'a aucun effet; il doit être défini à partir d'un gestionnaire de soumission.
kiamlaluno
la source
Merci pour cela. Notez que l' &entrée function custom_node_submit($form, &$form_state) {est très importante. Sinon, vous ne passez pas l'état comme référence et les modifications que vous effectuez manuellement ne seront pas prises en compte.
Bram
9

Ce code fonctionne sur un site Drupal 7.

/**
 * Implements hook_form_alter()
 */

function custom_form_alter(&$form, &$form_state, $form_id) {    
  if ($form_id == 'article_node_form') {
    $form['actions']['submit']['#submit'][] = 'mysubmit_node_submit';
  }     
}

function mysubmit_node_submit($form, &$form_state) {
  $form_state['redirect'] = '/homepage';
}
mer26.2
la source
À quelle réponse faites-vous référence # 4?
Елин Й.
pourquoi ça ne marche pas pour moi? J'utilise le même code
ruby
Vider votre cache @ruby?
coderama
Pour les nœuds existants, vous devez vous assurer de désactiver d'abord la destination, qui est normalement ajoutée à l'URL lorsque vous cliquez sur le bouton Modifier de la admin/contentpage: drupal.stackexchange.com/a/192271/15055 .
leymannx
4

Cela peut être fait en définissant $form_state['redirect'], par exemple en utilisant l'une des lignes suivantes.

$form_state['redirect'] = "some-internal-path";
$form_state['redirect'] = array($path, $options_array, $http_code);

Ce sont les mêmes arguments que vous transmettriez drupal_goto().

Shoaib Nawaz
la source
Merci pour les commentaires @Shoaib Nawaz. J'ai ajouté le $ form_state ['redirect'] au crochet hook_form_alter sans chance.
Citricguy
Pour ma vie, je ne peux pas faire en sorte que $ form_state ['redirect'] prenne effet n'importe où.
Citricguy
Cela ne fonctionnera pas si vous essayez de rediriger après l'ajout ou la modification d'un nœud. Pour voir pourquoi, jetez un œil à la forme du nœud soumettre . Quelle que soit la valeur à laquelle vous attribuez, $form_state['redirect']elle sera remplacée si elle est ($node->nid)évaluée à TRUE.
Radical gratuit du
2

Je ne sais pas si c'est une option pour vous, mais s'il s'agit d'un type de contenu, vous pouvez y parvenir assez rapidement en utilisant le module Règles en définissant une règle à déclencher lors de la mise à jour ou de la création d'un certain type de contenu.

Aaron Ortega
la source