Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

MDL-38555 forms: Prevent same data submission multiple times.

This disables Submit button when the form has been submitted to
prevent consequent submissions before the page has been loaded.
  • Loading branch information...
commit 761670208a97c0ed7e1ff7c2e6a7ec5494eb93d3 1 parent b3be471
@kabalin kabalin authored
Showing with 33 additions and 0 deletions.
  1. +9 −0 lib/form/submit.js
  2. +22 −0 lib/form/submit.php
  3. +2 −0  lib/formslib.php
View
9 lib/form/submit.js
@@ -0,0 +1,9 @@
+M.form_submit = {};
+
+M.form_submit.init = function(Y, options) {
+ Y.on('submit', function(e) {
+ if (!containsErrors) {
+ e.target.one('#'+options.submitid).setAttribute('disabled', 'true');
+ }
+ }, '#'+options.formid);
+};
View
22 lib/form/submit.php
@@ -38,6 +38,9 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class MoodleQuickForm_submit extends HTML_QuickForm_submit {
+ /** @var string Need to store id of form for submission control in JS*/
+ var $_formid = '';
+
/**
* constructor
*
@@ -60,6 +63,7 @@ function onQuickFormEvent($event, $arg, &$caller)
{
switch ($event) {
case 'createElement':
+ $this->_formid = $caller->getAttribute('id');
parent::onQuickFormEvent($event, $arg, $caller);
if ($caller->isNoSubmitButton($arg[0])){
//need this to bypass client validation
@@ -98,4 +102,22 @@ function freeze(){
$this->_flagFrozen = true;
}
+ /**
+ * Returns HTML for this form element.
+ *
+ * @return string
+ */
+ function toHtml(){
+ global $PAGE;
+ $options = array(
+ 'submitid' => $this->getAttribute('id'),
+ 'formid' => $this->_formid,
+ );
+ $str = parent::toHtml();
+ if ($this->getAttribute('onclick') === null) {
+ $module = array('name'=>'form_submit', 'fullpath'=>'/lib/form/submit.js');
+ $PAGE->requires->js_init_call('M.form_submit.init', array($options), true, $module);
+ }
+ return $str;
+ }
}
View
2  lib/formslib.php
@@ -2096,6 +2096,7 @@ function getValidationScript()
//<![CDATA[
var skipClientValidation = false;
+var containsErrors = false;
function qf_errorHandler(element, _qfMsg) {
div = element.parentNode;
@@ -2204,6 +2205,7 @@ function validate_' . $this->_formName . '(frm) {
var frm = document.getElementById(\''. $this->_attributes['id'] .'\')
var first_focus = false;
' . $validateJS . ';
+ containsErrors = !ret;
return ret;
}
//]]>
Please sign in to comment.
Something went wrong with that request. Please try again.