From 4c4b966a9229e55bddd129ebc460aed5b6e7d4ff Mon Sep 17 00:00:00 2001 From: godric Date: Tue, 29 Nov 2016 10:49:21 +0300 Subject: [PATCH] MDL-40132 lib: Using compare rule results in fatal error. In getValidationScript function variable $element can be an array or object. Function attempt get non-existing attributes. To avoid this we should check before accessing. --- lib/formslib.php | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/formslib.php b/lib/formslib.php index 2c8a3ea5519..1f7d4f47481 100644 --- a/lib/formslib.php +++ b/lib/formslib.php @@ -2165,12 +2165,14 @@ class MoodleQuickForm extends HTML_QuickForm_DHTMLRulesTableless { } //for editor element, [text] is appended to the name. $fullelementname = $elementName; - if ($element->getType() == 'editor') { - $fullelementname .= '[text]'; - //Add format to rule as moodleform check which format is supported by browser - //it is not set anywhere... So small hack to make sure we pass it down to quickform - if (is_null($rule['format'])) { - $rule['format'] = $element->getFormat(); + if (is_object($element) && $element->getType() == 'editor') { + if ($element->getType() == 'editor') { + $fullelementname .= '[text]'; + // Add format to rule as moodleform check which format is supported by browser + // it is not set anywhere... So small hack to make sure we pass it down to quickform. + if (is_null($rule['format'])) { + $rule['format'] = $element->getFormat(); + } } } // Fix for bug displaying errors for elements in a group @@ -2263,7 +2265,12 @@ require(["core/event", "jquery"], function(Event, $) { $elementName); $valFunc = 'validate_' . $this->_formName . '_' . $escapedElementName . '(ev.target, \''.$escapedElementName.'\')'; - $js .= ' + if (!is_array($element)) { + $element = [$element]; + } + foreach ($element as $elem) { + if (key_exists('id', $elem->_attributes)) { + $js .= ' function validate_' . $this->_formName . '_' . $escapedElementName . '(element, escapedName) { if (undefined == element) { //required element was not found, then let form be submitted without client side validation @@ -2286,13 +2293,15 @@ require(["core/event", "jquery"], function(Event, $) { } } - document.getElementById(\'' . $element->_attributes['id'] . '\').addEventListener(\'blur\', function(ev) { + document.getElementById(\'' . $elem->_attributes['id'] . '\').addEventListener(\'blur\', function(ev) { ' . $valFunc . ' }); - document.getElementById(\'' . $element->_attributes['id'] . '\').addEventListener(\'change\', function(ev) { + document.getElementById(\'' . $elem->_attributes['id'] . '\').addEventListener(\'change\', function(ev) { ' . $valFunc . ' }); '; + } + } $validateJS .= ' ret = validate_' . $this->_formName . '_' . $escapedElementName.'(frm.elements[\''.$elementName.'\'], \''.$escapedElementName.'\') && ret; if (!ret && !first_focus) {