From 0d7dcbf1aef20ac645f5d8e5d40cdf7d61fa5f2d Mon Sep 17 00:00:00 2001 From: Rajesh Taneja Date: Wed, 31 Aug 2011 14:25:34 +0800 Subject: [PATCH] MDL-28987 Forms Library: Added tinyMCE onblur event callback for required tinymce fields --- lib/editor/tinymce/lib.php | 5 ++++- lib/editor/tinymce/module.js | 25 +++++++++++++++++++++++++ lib/form/editor.php | 17 +++++++++++++---- lib/formslib.php | 28 +++++++++++++++------------- 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/lib/editor/tinymce/lib.php b/lib/editor/tinymce/lib.php index 99c070a8ca9..5afc6eae824 100644 --- a/lib/editor/tinymce/lib.php +++ b/lib/editor/tinymce/lib.php @@ -172,7 +172,10 @@ class tinymce_texteditor extends texteditor { $params['file_browser_callback'] = "M.editor_tinymce.filepicker"; } } - + //Add onblur event for client side text validation + if (!empty($options['required'])) { + $params['init_instance_callback'] = 'M.editor_tinymce.onblur_event'; + } return $params; } } diff --git a/lib/editor/tinymce/module.js b/lib/editor/tinymce/module.js index 7db01985456..3978bcea59b 100644 --- a/lib/editor/tinymce/module.js +++ b/lib/editor/tinymce/module.js @@ -72,3 +72,28 @@ M.editor_tinymce.filepicker = function(target_id, url, type, win) { }); }; +M.editor_tinymce.onblur_event = function(ed) { + //Attach event only after tinymce is intialized. + if (ed.onInit != undefined) { + var s = ed.settings; + //Save before event is attached, so that if this event is not generated then textarea should + //have loaded contents and submitting form should not throw error. + ed.save(); + + //Attach blur event for tinymce to call onchange validation function of textarea. + var doc = s.content_editable ? ed.getBody() : (tinymce.isGecko ? ed.getDoc() : ed.getWin()); + tinymce.dom.Event.add(doc, 'blur', function() { + //save contents to textarea before calling validation script. + ed.save(); + var element = document.getElementById(ed.id); + element.onchange(element); + }); + + //Add an extra event to make sure after window is blurred because of user clicking + //out of tinymce or any popup occured, then error should be cleaned on focusing back. + tinymce.dom.Event.add(doc, 'focus', function() { + var element = document.getElementById(ed.id); + qf_errorHandler(element, ''); + }); + }; +}; diff --git a/lib/form/editor.php b/lib/form/editor.php index 677571f29b9..eeec855fc5c 100644 --- a/lib/form/editor.php +++ b/lib/form/editor.php @@ -86,13 +86,22 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element { $this->_options['subdirs'] = $allow; } + /** + * Returns editor format + * + * @return int. + */ + function getFormat() { + return $this->_values['format']; + } + /** * Checks if editor used is tinymce and is required field * * @return true if required field. */ - function isRequiredTinymce() { - return (isset($this->_options['required_tinymce']) && $this->_options['required_tinymce']); + function isRequired() { + return (isset($this->_options['required']) && $this->_options['required']); } function setHelpButton($_helpbuttonargs, $function='_helpbutton') { @@ -209,7 +218,7 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element { //If editor is required and tinymce, then set required_tinymce option to initalize tinymce validation. if (($editor instanceof tinymce_texteditor) && !is_null($this->getAttribute('onchange'))) { - $this->_options['required_tinymce'] = true; + $this->_options['required'] = true; } /// print text area - TODO: add on-the-fly switching, size configuration, etc. @@ -221,7 +230,7 @@ class MoodleQuickForm_editor extends HTML_QuickForm_element { //Apply editor validation if required field $editorrules = ''; if (!is_null($this->getAttribute('onblur')) && !is_null($this->getAttribute('onchange'))) { - $editorrules = 'onblur="'.$this->getAttribute('onblur').'" onchange="'.$this->getAttribute('onchange').'"'; + $editorrules = 'onblur="'.htmlspecialchars($this->getAttribute('onblur')).'" onchange="'.htmlspecialchars($this->getAttribute('onchange')).'"'; } $str .= '