Problematik / Zielstellung
Es gibt nach wie vor Internetnutzer, die Formulare mit einem Doppelklick abschicken oder beim Versenden mehrfach auf den Absendebutton klicken, wenn nicht sofort ein Feedback vom Server kommt. Üblicherweise wird dann das Formular doppelt abgesendet und schlagen beim Administrator in ungewollten Mengen auf. Einige Browser sind mittlerweile mit einer Funktion ausgestattet, die die Submit-Button automatisch deaktivieren, sobald der Nutzer das erste mal geklickt hat. Leider nicht alle, weshalb eine programmierte Lösung her muss.
Prinzipeller Ansatz der Lösung
Immer mal wird darüber diskutiert wo man die Mehrfachversendung unterbinden sollte. Dies innerhalb der Server-Scripte vorzunehmen ist denkbar ungünstig und erheblich aufwändiger. Sinnvoll ist hier nur clientseitig im Brower per JavaScript ein mehrfaches Absenden zu unterbinden. Das geschieht am besten, indem der Button nach dem ersten klick und nach dem Validieren der Formulardaten sofort auf disabled gesetzt wird.
BreezingForms verwendet bereits diverse JavaScript-Funktionen z.B. für die Formular-Validierung oder das Prüfen der Captcha-Code-Eingaben. Verantwortlich sind hier die JS-Funktionen ff_submitForm() und ff_submitForm2(). Erstere bindet die Captcha-Prüfung ein und bei Erfolg wird dann das Formular per ff_submitForm2() schließlich versendet.
Das Abschalten des Submit-Buttons darf erst erfolgen, nachdem die Captcha-Eingabe erfolgreich bestätigt wurde, aber vor dem Absenden.
Umsetzung im Detail
Oben genannte JS-Funktion ff_submitForm2() wollen wir zu diesem Zweck erweitern. Dieses Script wird in die Seite eingebunden bei der Ausführung des BreezingForms-Hauptscriptes facileforms.process.php im Verzeichnis components/com_breezingforms/. Ca. Zeile 1326ff wird der String $code zusammengebaut und als $library[] - Array zur Ausgabe zusammengefügt. Wir fügen hier JavaScript-Zeilen ein, die das Formular nach dem Submit-Button durchsuchen, den Button dann deaktivieren und evtl. zusätzlich mit einer Sanduhrgrafik als Background versehen. So sehen die Änderungen dann konket aus:
facileforms.process.php | |
1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 |
$code.= "function ff_submitForm2()".nl(). "{".nl(); $code .= " var form = document.".$this->form_id."; var num = form.elements.length; for (var i=0; i < num; i++) { if ( form.elements[i].type == 'submit' ){ form.elements[i].disabled = true; form.elements[i].value= 'Bitte warten'; form.elements[i].style.backgroundColor = '#FFFFFF'; form.elements[i].style.backgroundImage = 'url(/images/loadingcircle.gif)'; form.elements[i].style.backgroundPosition = 'center'; form.elements[i].style.backgroundRepeat = 'no-repeat'; } }"; if ($this->inline) $code .= " submitform('submit');".nl(); else $code .= " document.".$this->form_id.".submit();".nl(); $code .= "} // ff_submitForm"; $library[] = array('ff_submitForm', $code); |
Hinzugefügt wurden die Zeilen 1324 bis 1334 im Codebeispiel.
Bitte beachten, dass dies Eingriffe in die CORE-Scripte von BreezingForms sind. Bei zukünfigen Updates muss das berücksichtigt werden!