#TinyMCE Template plugin example with “insert-after” functionality
Example of use of templates, and with a feature trick to insert in bottom of the editor. #TinyMCE
Published 1st of October 2018
TinyMCE version 4 and later…
The Template plugin is easy to implement (check further down and documentation), but by default the template is inserted where the marker is. And I wanted the template to be added at the end of the document.
I looked into adding a new “insert after”-button on template-plugin UI, but that wasn’t doable.
Solution
Tag the html-templates and use the BeforeSetContent-event to hi-jack the pipe with your logic.
So, in the HTML templates I did start with a data attribute “<div data-insertafter” meaning it should have that behavior.
Template example:
<div data-insertafter class="tmpl1">
<div class="padding">
<h2>Template 1</h2>
<p>Fusce accumsan ligula at dolor vulputate malesuada.</p>
</div>
</div>
- Implement the standard template plugin
- Register a custom plugin in tinymce.PluginManager
"use strict";
var tinymce = tinymce || {};
tinymce.PluginManager.add('insertaftertemplate', function (editor, url) {
editor.on('BeforeSetContent', function (e) {
if (e.content.include("<div data-insertafter")) {
editor.setContent(editor.getContent() + '<div class="row"></div>');
editor.selection.select(editor.getBody(), true);
editor.selection.collapse(false);
e.content = e.content.replace("data-insertafter", "");
}
});
return {
getMetadata: function () {
return {
name: 'Insert after for Templates', url : 'https://devblog.gosso.se/?p=847'
};
}
};
});
How to implement Template Plugin
All you need is …
1. add the source code to page
<script src=”/tinymce/js/tinymce.min.js”></script> <script src=”/ClientResources/Scripts/tinymce/plugins/template_insert_hack/editor_plugin_v4.js “></script>
2. configure the template plugin
tinymce.init({
selector: "textarea", // change this value according to your HTML
plugins: "template insertaftertemplate", //
menubar: "insert",
toolbar: "template",
templates: "/dir/.../templates.htm" //json file
});
I choose to configure the templates in external file with json format “template.htm”
[
{"title": "Template 1", "description": "inserting inline", "url": "/ClientResources/Scripts/tinymce/plugins/template_insert_hack/tmpl1.htm"},
{"title": "Template 1 (after)", "description": "Inserting after", "url": "/ClientResources/Scripts/tinymce/plugins/template_insert_hack/tmpl1a.htm"},
{"title": "Template 2", "description": "inserting inline", "url": "/ClientResources/Scripts/tinymce/plugins/template_insert_hack/tmpl2.htm"},
{"title": "Template 2 (after)", "description": "Inserting after", "url": "/ClientResources/Scripts/tinymce/plugins/template_insert_hack/tmpl2a.htm"}
]
Example filestructure

Register in a custom plugin in Episerver
With package Episerver.Cms.Tinymce v2 and later, you use TinyMceInitialization like this:
using EPiServer.Cms.TinyMce.Core;
using EPiServer.Framework;
using EPiServer.Framework.Initialization;
using EPiServer.ServiceLocation;
namespace Gosso.Mvc.Business.Initialization
{
[ModuleDependency(typeof(TinyMceInitialization))]
public class CustomizedTinyMceInitialization : IConfigurableModule
{
public void Initialize(InitializationEngine context) { }
public void Uninitialize(InitializationEngine context) { }
public void ConfigureContainer(ServiceConfigurationContext context)
{
context.Services.Configure<TinyMceConfiguration>(config =>
{
config.Default()
.AddSetting("template_popup_width", 1100)
.AddSetting("templates", "/ClientResources/Scripts/tinymce/plugins/template_insert_hack/templates.htm")
.AddExternalPlugin("insertaftertemplate",
"/ClientResources/Scripts/tinymce/plugins/template_insert_hack/editor_plugin_v4.js");
});
}
}
}
Resources
SEO-Terms
- Insert before, insert bottom templates plugin
- Insert data after the content template plugin
- tinymce 4 template plugin example
- using tinymce template
About the author
Luc Gosso
– Independent Senior Web Developer
working with Azure and Episerver
Twitter: @LucGosso
LinkedIn: linkedin.com/in/luc-gosso/
Github: github.com/lucgosso