web-dev-qa-db-fra.com

Comment ajouter un bouton de réinitialisation aux formulaires?

Je fais des recherches sur cette question depuis un certain temps sans réponse claire pour le moment.
Alors, voici quelques questions ...

  1. Je suis en supposant (corrigez-moi si je me trompe) que Drupal 7 ne prend pas en charge les boutons de réinitialisation. Il apparaît, selon l'API de formulaire (comme discuté dans Pro Drupal 7 Development), que tous les boutons (input type = "submit", button et image_button) sont par défaut des boutons de soumission. Il ne semble pas y avoir de moyen de passer outre les valeurs par défaut non plus.

    Donc, si je voulais ajouter des fonctionnalités à mes formulaires pour que mes utilisateurs effacent les formulaires (s'ils le souhaitent), devrais-je créer un module?

  2. Serais-je capable de retirer cela en utilisant le type de bouton général avec executes_submit_callback défini sur false et en ajoutant un type de fonction Ajax au événement mousedown?

** EDIT: j'ai ajouté ce qui suit à mon hook_form_alter () **

$form['reset'] = array(
'#input' => TRUE,
'#name' => 'reset',
'#button_type' => 'reset',
'#executes_submit_callback' => FALSE,
'#limit_validation_errors' => TRUE,
'#process' => '',
'#theme_wrappers' => array('button'),
);

J'ai reçu le message d'erreur et l'avertissement suivants:

Remarque: index non défini: #type dans _form_builder_handle_input_element () (ligne 1949 de /var/www/vhosts/lae/drupal-7.11/includes/form.inc).

Avertissement: argument non valide fourni pour foreach () dans form_builder () (ligne 1763 de /var/www/vhosts/lae/drupal-7.11/includes/form.inc).

Existe-t-il un moyen d'ajouter le type de bouton "reset" aux types de boutons sans planter le formulaire complet.inc?

5
dqfan2012

Ma façon préférée de le faire est.

Ajoutez le bouton à votre formulaire comme ceci:

$form['options']['reset'] = array(
  '#type' => 'submit',
  '#value' => t('Reset'),
  '#submit' => array('MY_MODULE_FORM_ID_reset'),
);

Créez ensuite la fonction de réinitialisation comme suit:

function MY_MODULE_FORM_ID_reset($form, &$form_state) {
  $form_state['rebuild'] = FALSE;
}

Pas de Javascript, pas de balisage.

10
Nick Barrett

Je ne connais pas la prise en charge dans l'API Form pour un bouton de réinitialisation, mais assez simple pour ajouter une modification de formulaire pour en ajouter une.

MYMODULE_form_alter($form, $form_state, $form_id) {
  $form['resetbutton'] = array(
    '#markup' => '<button type="reset"/>',
    '#weight' => 1000
  );
  return $form;
}
6
Jason Smith
function mymodule_form_alter(&$form, &$form_state, $form_id) {

switch ($form_id) { 

case 'myform':
  $form['buttons']['reset_button'] = array(
    '#type' => 'markup',
    '#value' => '<input class="form-button" value="Reset" type="reset">',
    '#weight' => 2000,
  );
  break;
 }
 return $form;
}
2
Mahipal Purohit

Cela fonctionne à 100%:

$form['reset'] = array(
    '#type' => 'markup',
    '#markup' => '<input type="reset" value="Reset All Values" class="form-submit">',
);
1
Himanshu Pathak

Habituellement, je donne un lien hypertexte de réinitialisation qui pointe vers l'URL de la page actuelle en utilisant le type de formulaire de balisage.

Chaque fois que nous cliquons sur ce lien, il rafraîchira la page et réinitialisera tous les éléments du formulaire. Sinon, en utilisant javascript/Jquery, nous pouvons réinitialiser les éléments du formulaire en fournissant une classe/ID CSS spécifique à ce lien.

0
kalidasan

Aucune des réponses précédentes n'a fonctionné dans le cas auquel j'ai été confronté (views_exposed_form Avec BEF et ajax activé). J'avais configuré le bouton de réinitialisation de BEF, mais cela ne fonctionnait que pour l'un de mes deux affichages, quoi que j'aie essayé ...

Je propose une autre approche, au cas où cela pourrait aider.

/**
 * Implements hook_form_FORM_ID_alter().
 */
function moduleName_form_views_exposed_form_alter(&$form, &$form_state) {

  if (isset($form_state['view']->current_display) && 'some_display' == $form_state['view']->current_display ) {

    $submit_btn_id = $form['submit']['#id'];
    if (!empty($submit_btn_id) && !empty($form['reset'])) {
      //avoid the know issue redirecting views resets to /node
      $form['#action'] = '/' . $_GET['q'];
      // Add own reset button
      $form['submit']['#suffix'] = '<input type="reset" onclick="javascript:jQuery(this.form).clearForm();jQuery(this.form).find(\'#' . $submit_btn_id . '\').trigger(\'click\');return false;">' . t('Reset') . '</input>';
      $form['submit']['#attributes']['class'][] = 'my-views-filter-submit';
      // Remove the original RESET button.
      unset($form['reset']);
    }
  }
}

À propos du problème de redirection des vues réinitialisé à /node ... onclick="history.go(0); est une alternative.

Cela a été inspiré par le blog de Julian ajouter un bouton de réinitialisation ajaxified pour les vues des filtres exposés mais j'ai dû l'adapter considérablement.

0
Kojo