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 ?