MDL-54633 tinymce: Sync editors' iframe to textarea on form submit
authorDavid Mudrák <david@moodle.com>
Thu, 19 May 2016 11:20:44 +0000 (13:20 +0200)
committerDavid Mudrák <david@moodle.com>
Thu, 19 May 2016 11:44:41 +0000 (13:44 +0200)
The previous commit "Automatically sync editor with its textarea" was
found a not good solution as the onchange event is triggered way less
often than needed for our needs. So this reverts commit 34321d49.

Instead, we add a hack to the formslib so that when there are some
TinyMCE editors used at the page, we explicitly save them before
triggering the form validation. This simply calls save() on all editors
on the page - see the API reference:
http://archive.tinymce.com/wiki.php/API3:method.tinymce.triggerSave

Having TinyMCE hardcoded like this on this core level does not make me
happy. But it seems to be most effective solution for now (and
definitely more efficient than the previous solution). Plus there is a
precedence - we already use window.tinyMCE in formchangechecker.js YUI
module, for example.

lib/editor/tinymce/module.js
lib/formslib.php

index 4b227d1..d3118ef 100644 (file)
@@ -45,7 +45,6 @@ M.editor_tinymce.init_editor = function(Y, editorid, options) {
         M.editor_tinymce.initialised = true;
         M.util.js_pending('editors');
         options.oninit = "M.editor_tinymce.init_callback";
-        options.onchange_callback = "M.editor_tinymce.onchange_callback";
     }
 
     M.editor_tinymce.editor_options[editorid] = options;
@@ -93,12 +92,6 @@ M.editor_tinymce.init_callback = function() {
     M.util.js_complete('editors');
 }
 
-M.editor_tinymce.onchange_callback = function(editorinstance) {
-    // We need to keep the underlying textarea in sync so that when the form
-    // validator is triggered, it has the value property up-to-date.
-    editorinstance.save();
-};
-
 M.editor_tinymce.init_filepicker = function(Y, editorid, options) {
     M.editor_tinymce.filepicker_options[editorid] = options;
 };
index e531486..727309e 100644 (file)
@@ -2316,6 +2316,9 @@ var skipClientValidation = false;
         } catch(e) {
             return true;
         }
+        if (typeof window.tinyMCE !== \'undefined\') {
+            window.tinyMCE.triggerSave();
+        }
         if (!myValidator()) {
             ev.preventDefault();
         }