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.
This commit is contained in:
Ruslan Kabalin 2013-03-19 15:09:50 +00:00
parent b3be471f52
commit 761670208a
3 changed files with 33 additions and 0 deletions

9
lib/form/submit.js Normal file
View File

@ -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 File

@ -38,6 +38,9 @@ require_once("HTML/QuickForm/submit.php");
* @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 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit {
{
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 @@ class MoodleQuickForm_submit extends HTML_QuickForm_submit {
$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 File

@ -2096,6 +2096,7 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless {
//<![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;
}
//]]>