2009-09-11 9 views
2

J'ai deux boutons de soumission sur mon formulaire. L'un est le bouton normal qui appelle `soumettre my_form_submit` comme-ah-so:Comment ajouter deux boutons de soumission à un formulaire Drupal 5?

$form['fieldset']['submit'] = array(
    '#type' => 'submit', 
    '#value' => 'Show Applications', 
); 

Je veux ajouter un autre bouton qui présentera le formulaire, mais appeler un autre gestionnaire soumettre. Est-ce qu'il y a un moyen de faire ça? Je l'ai regardé ajouter la propriété #submit à un élément comme-ah-so:

$form['fieldset']['evil_plan'] = array(
    '#type' => 'submit', 
    '#value' => 'Big Red Button', 
    '#submit' => array('steal_formula_for_icantbeliveitsnotbutter'), 
); 

espérant appeler la fonction `steal_formula_for_icantbeliveitsnotbutter` mais pas worky. Quand je clique sur le gros bouton rouge, la fonction normale `my_form_submit` est appelée, ce qui retarde mon plan visant à faire des millions de dollars d'un substitut au beurre. Qui peut faire la lumière sur ce gâchis sombre?

Répondre

4

pour Drupal 5, ceci est la seule solution:

function my_form_submit($form_id, $form_values) { 
    if ($form_values['op'] == 'Show Applications') { 
    // handle 'Show Applications' submission 
    } 
    elseif ($form_values['op'] == 'Big Red Button') { 
    // handle 'Big Red Button' submission 
    } 
} 

même pour my_form_validate.

dans Drupal 6, cela peut être fait plus facilement avec le custom #submit and #validate handlers for form buttons nouvellement introduit.

+0

Je voulais éviter de faire la même soumettre la fonction. Est-il vraiment impossible de le rediriger vers une autre fonction de soumission sans passer par la fonction normale? – jergason

+0

+1, car c'était la réponse initiale et correcte de Drupal 5! (Maintenant si vous aviez juste mentionné que vous avez vérifié la différence 5/6, je n'aurais pas interféré en premier lieu;) –

+0

essayant toujours d'être aussi concis que possible :) tnx pour le +1. –

3

Edit: Un contrôle plus étroit de l'API Forms documentation a révélé que ma réponse initiale ci-dessous est valable pour Drupal 6, mais seulement partiellement valable pour Drupal 5. En comparant les Drupal 5 docs avec le Drupal 6 docs montre que dans Drupal 5, vous pouvez enregistrer uniquement les fonctions de rappel sur le formulaire lui-même - la propriété '#submit' d'un bouton est simplement un booléen indiquant que le bouton doit être géré comme un bouton d'envoi. L'ajout de callbacks 'par bouton' est donc uniquement une fonctionnalité de Drupal 6!

Pour la question donnée, cela signifie qu'il n'y a que la si option/elseif suggéré par la hache, ou la variation de l'enregistrement de deux soumettre callbacks pour la forme, la vérification de chaque si elles sont appelées pour le bouton droit (essentiellement la version if/elseif, mais en utilisant deux callbacks séparés).


(réponse initiale)

Il y a plusieurs mécanismes à l'œuvre ici:

  1. Soumettre (et valider) callbacks peuvent être enregistrés pour les boutons individuels, mais aussi pour la forme elle-même ($form['#submit']). Ceux enregistrés pour le formulaire sont appelés pour chaque bouton de soumission, ceux enregistrés pour un bouton individuel seulement pour celui-là. (NOTE: Importante différence Drupal 5/6 ici, voir édition ci-dessous.)
  2. La gestion de formulaire par défaut (soumettre et valider les fonctions nommées d'après le formulaire) fonctionne par Drupal ajoutant automatiquement des rappels pour ceux des tableaux '#submit' et '#validate'.
  3. L'enregistrement utilise des tableaux afin de permettre à plusieurs fonctions de soumission/validation d'être appelées les unes après les autres (dans le même ordre qu'elles apparaissent dans le tableau).

Donc, dans votre cas, vous pouvez faire le si/commutateur elseif suggéré par la hache, ou vous auriez besoin de désinitialiser les callbacks « globaux » pour la forme, en le déplaçant explicitement la valeur par défaut bouton d'envoi:

$form['fieldset']['submit']['#submit'] = $form['#submit']; 
unset($form['#submit']; 

(même chose pour callbacks validate)

Après cela, votre exemple affiché pour le Big Red Button exécuter le plan du mal devrait fonctionner comme prévu;)

+0

Cela a du sens. Ainsi, les callback $ form ['# submit'] (et validate) remplacent les uns des éléments. Y a-t-il un callback #validate que je dois aussi paramétrer? – jergason

+0

Oui, la validation suit le même mécanisme, donc si vous avez besoin de/utilisez la validation, vous feriez la même chose pour les rappels de validation. –

+0

Oups, juste tombé sur une différence Drupal 5/6 dans ce contexte, voir edit pour plus de détails. –

Questions connexes