Ich habe ein Problem, bei dem ein Benutzer jedes von der Formular-API erstellte Formular mehrmals senden kann (schnelles Klicken führt zu mehreren Anforderungen).
Ich habe die grundlegende clientseitige (Javascript) Lösung zum Deaktivieren der Schaltfläche eingeführt, bin aber gespannt, wie diese Situation am besten auf der Serverseite verhindert werden kann.
Gibt es eine empfohlene Möglichkeit, das Formular-Token-System von Drupal zu verwenden, um dies zu handhaben? Insbesondere eine globale Formularlösung (dh Hinzufügen eines benutzerdefinierten Validators zu jedem Formular mithilfe von hook_form_alter ()).
Mein bisheriger Ansatz war ungefähr so:
function mymodule_form_alter(&$form, &$form_state, $form_id) {
$form['#validate'][] = 'mymodule_form_validate';
}
function mymodule_form_validate(&$form, &$form_state){
//initialize form array
if (!isset($_SESSION['submitted_forms'])){
$_SESSION['submitted_forms'] = array();
}
$form_token = $form_state['values']['form_token'];
if ( isset($_SESSION['submitted_forms'][$form_token]) && $_SESSION['submitted_forms'][$form_token] = TRUE ){
form_set_error('name]', 'This form has already been submitted');
}
else{
$_SESSION['submitted_forms'][$form_token] = TRUE;
}
}
Ich habe Probleme, wenn das form_token nicht nur für das Formular gilt - es scheint gleich zu bleiben, egal was passiert. Ich verstehe wahrscheinlich falsch, was das Token im großen Schema der Form API ist.
Jeder Einblick wird geschätzt!
Antworten:
Ich hatte genau das gleiche Problem und konnte es mithilfe der Sperrmechanismen von Drupal beheben
In der Validierungsfunktion habe ich verwendet:
Und in der Submit-Funktion habe ich die Sperre aufgehoben:
quelle
Hier sollten Sie das Modulgewicht berücksichtigen:
quelle
Wenn Sie diese Funktionalität für alle Formulare und mehr Kontrolle ohne Codierung wünschen, schauen Sie sich das Modul Hide Submit Button an .
quelle
hoffe das wird helfen ..
oder Sie können verweisen Verhindern mehrere Klicks von Submit - Button & Drupal hat ein Modul ausblenden Absenden - Button
quelle
Das war auch vorher mein Problem. Meine Lösung besteht darin, die Schaltfläche über JS zu deaktivieren.
.Modul:
JS:
quelle