web-dev-qa-db-fra.com

Gérez plusieurs boutons d'envoi dans Drupal form API

J'ai 2 boutons d'envoi et je souhaite effectuer différentes actions pour chaque bouton d'envoi. Ici, je veux définir les champs de formulaire qui ne peuvent être effectués que dans form_alter (). Quelqu'un peut-il suggérer comment vérifier plusieurs boutons d'envoi dans la fonction form_alter ()?

J'ai utilisé

function myform_form_submit($formID, &$form_state) {
if($form_state['clicked_button']['#value'] == $form_state['values']['submit_one'])    //if button 1      is clicked
     $form_state['redirect'] = 'mypath/page_one';   //redirect to whatever page you want
 else if($form_state['clicked_button']['#value'] == $form_state['values']['submit_two'])  /if button      2 is clicked
    $form_state['redirect'] = 'mypath/page_two';
 }

mais ça ne marche pas

27
user550265

La meilleure chose à faire si vous avez deux boutons d'envoi sur un formulaire et que vous souhaitez qu'ils fassent des choses différentes, est de créer une fonction d'envoi différente pour chaque bouton et de les connecter. L'un des avantages de FormAPI est qu'il lie automatiquement le formulaire au gestionnaire de soumission pour vous, mais si vous avez deux boutons de soumission, vous voulez aller quelque part.

Ainsi, votre code de formulaire est susceptible de contenir:

$form['submit_one'] = array(
  '#type' => 'submit',
  '#value' => t('Submit One'),
  '#submit' => array('my_module_form_submit_one'),
);
$form['submit_two'] = array(
  '#type' => 'submit',
  '#value' => t('Submit Two'),
  '#submit' => array('my_module_form_submit_two'),
);

Mais je ne sais pas ce que vous entendez par form_alter () - il n'y a aucune raison d'utiliser un changement de formulaire de quelque sorte que ce soit.

Edit: Comme indiqué dans les commentaires - si vous avez besoin de différentes fonctions de validation pour les deux boutons, vous pouvez également inclure '#validate' => array('my module_form_validate_one') et '#validate' => array('my module_form_validate_two') dans les tableaux de boutons respectifs. Mais ce n'est pas obligatoire, et si la fonction de validation de formulaire standard fonctionne correctement, allez-y.

51
John Fiala

Si vous souhaitez gérer différents clics sur le bouton d'envoi dans une même fonction d'envoi, vous pouvez vérifier:

if($form_state['values']['op'] == BUTTON_ONE_VALUE){
} else if($form_state['values']['op'] == BUTTON_TWO_VALUE){
}

Ou vous pouvez d'abord attribuer certaines propriétés au bouton, puis vérifier:

$form_state['triggering_element']['#attributes'][YOUR_PROPERTY] == VALUE

J'utilise Drupal 7 ... J'espère que cela aide

15
songyy

Bien que la réponse acceptée soit correcte, il convient de noter que vous devez transmettre des valeurs différentes avec chacun de vos boutons d'envoi, sinon la fonction d'envoi utilisée sera le dernier bouton d'envoi défini.

En d'autres termes, si la valeur des deux boutons d'envoi est "Soumettre", alors seule la deuxième fonction d'envoi sera appelée, quel que soit le bouton enfoncé.

3
Jeremy Rimpo