4 votes

Drupal 7 comment prévenir les soumissions multiples de formulaire (côté serveur)

Voici le code du module de travail que je teste :

/**
 * @file myform.module
 */

/**
* Implémente hook_menu().
*/
function myform_menu() {
  $items['myform'] = array(
    'title' => 'myform',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('myform'),
    'access callback' => true,
    'type' => MENU_NORMAL_ITEM
  );
  return $items;
}

/**
* Form
*/
function myform() {
  $form['Value'] = array(
    '#title' => t('Value'),
    '#type' => 'textfield',
    '#description' => t('Vous ne pouvez pas entrer la même valeur deux fois. (à moins d'appuyer sur Entrée très rapidement).'),
    '#required' => true,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Soumettre')
  );
  return $form;
}

/**
* Valider
*/
function myform_validate($form, &$form_state) {
  if (isset($form_state['values']['Value']) && trim($form_state['values']['Value'])!=''){
    // empêcher les doublons
    db_set_active('test');
    $r = db_query("SELECT id FROM test WHERE value = '".$form_state['values']['Value']."'");
    $n = $r->rowCount();
    if ($n) {
      form_set_error('Value', t('Cette valeur a déjà été soumise.'));
    }
    db_set_active();
  }
}

/**
* Soumettre
*/
function myform_submit($form, &$form_state) {

  for ($i=0; $i<=10000000; $i++) {
    // ne rien faire
  }

  db_set_active('test');
  db_insert('test')->fields(array('value'=>$form_state['values']['Value']))->execute();
  db_set_active();
}

Le crochet de validation empêche l'insertion de valeurs en double, sauf si j'appuie rapidement sur la touche entrée ou sur le bouton de soumission, auquel cas la même valeur est insérée plusieurs fois dans la base de données.

Comment puis-je empêcher l'insertion de valeurs en double ?

3voto

osman Points 502

Si vous voulez dire que les utilisateurs cliquent accidentellement sur le bouton de soumission plus d'une fois, alors vous devriez examiner le module Hide submit button. Vous pouvez le définir comme dépendance dans le fichier INFO de votre module.

2voto

Marius Ilie Points 2235

J'avais exactement le même problème et j'ai réussi à le résoudre en utilisant les mécanismes de verrouillage de Drupal

Dans la fonction de validation, j'ai utilisé :

function mymodule_custom_form_validate($form, &$form_state){
  if (lock_acquire('your_custom_lock_name')) {
    // opérations longues ici
  } else {
    form_set_error("", t("Vous avez déjà soumis ce formulaire."));
  }
}

Et dans la fonction de soumission, j'ai libéré le verrou :

function mymodule_custom_form_submit($form, &$form_state){
  // code de soumission
  lock_release('your_custom_lock_name');
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X