allBlogsList

Adding a custom button to the Rich Text Editor's toolbar in Sitecore 7

Recently I had requirements from a client to add a few custom buttons to the Rich Text Editor’s toolbar. While I found this blog particularly helpful, it didn’t quite work for me in Sitecore 7. Furthermore, I have a few best-practice tips. So here it is a step by step guide to adding a button to the Rich Text Editor. Login to Sitecore as an admin and switch over to the Core database. Navigate to /sitecore/system/Settings/Html Editor Profiles In here you will see a folder for each of the toolbars, its best not to mess with any of the default Sitecore toolbars, so make a copy of Rich Text Full – In my example, I named it Rich Text AR Full Drill down into the newly created directory and you should see Toolbar 1. Right click on Toolbar1 and insert __Html Editor Button Give it a name and a value for the Click Event. Lastly change the icon by click on Configure in the toolbar and selecting the Icon button. arScreenShot In your web.config, be sure and update the HtmlEditor.DefaultProfile value to point to the newly created toolbar, in my case Rich Text AR Full Open up windows explorer go to your website directory. Browse to \sitecore\shell\Controls\Rich Text Editor. In there you’ll see InsertImage – Copy that sucker within the same directory and rename it to whatever you named your button, in my case QuoteBig Rename both the xml and js file to the button’s name arFileDir Open the js file. In here we are looking for one function – scClose In my case, I am prompting the user to insert some text. So I want to update the return type with “text” in place of “image.” My new scClose function looks like this:

function scClose(text) {
var returnValue = {
text:text
};
getRadWindow().close(returnValue);
}

Now - open the xml file. Make the following updates:

  • Update the RichText tag to include your button’s name.
  • Change the Form Dialog to point to the icon you selected and update the helper text
  • In the script tag, be sure it is pointing to the js file we updated in the previous step.
  • For the CodeBehind, we’ll have to come back and update this node

This is how mine looks

<control xmlns:def="Definition" xmlns="http://schemas.sitecore.net/Visual-Studio-Intellisense"> 
    <RichText.QuoteBig> 
        <FormDialog Icon="WordProcessing/32x32/show_symbols.png" Header="Insert Big Quote Block" Text="Insert the text you would like quoted" OKButton="Insert"> 
            <script Type="text/javascript" Language="javascript" Src="/sitecore/shell/Controls/Rich%20Text%20Editor/QuoteBig/QuoteBig.js">.</script> 
            <CodeBeside Type="AR.Website.XmlControls.QuoteBig, AR.Website"/> 
            <GridPanel Width="100%" Height="100%" Style="table-layout:fixed"> 
                <Memo ID="memCode" Style="height:100%;width:100%;border-top:1px solid #919b9c" ></Memo> 
            </GridPanel> 
        </FormDialog> 
    </RichText.QuoteBig> 
</control>

Next we need to create and compile the class. I created an XmlControls directory in the root of my websitefolder and added the new class there. arVisualStudio Here is what my class looks like. Take note of the namespace as you’ll need to update your xml file to point to this class. Also, within the OnOK function, you’ll notice I added some html around the content. This is where you can do any kind of alteration to the user’s input that you’d like.  

namespace AR.Website.XmlControls
{
    public class QuoteBig : DialogForm
    {
        protected Sitecore.Web.UI.HtmlControls.Memo memCode;

        protected override void OnLoad(EventArgs e)
        {
            Assert.ArgumentNotNull(e, "e");
            base.OnLoad(e);
            if (!Context.ClientPage.IsEvent)
            {
                this.Mode = WebUtil.GetQueryString("mo");
                string text = WebUtil.GetQueryString("selectedText");
                memCode.Value = text;
            }
        }

        protected override void OnOK(object sender, EventArgs args)
        {
            Assert.ArgumentNotNull(sender, "sender");
            Assert.ArgumentNotNull(args, "args");

            string content = "<blockquote class=\"large\">" + memCode.Value + "</blockquote>";

            if (this.Mode == "webedit")
            {
                SheerResponse.SetDialogValue(StringUtil.EscapeJavascriptString(content));
                base.OnOK(sender, args);
            }
            else
                SheerResponse.Eval("scClose(" + StringUtil.EscapeJavascriptString(content) + ")");
        }

        protected override void OnCancel(object sender, EventArgs args)
        {
            Assert.ArgumentNotNull(sender, "sender");
            Assert.ArgumentNotNull(args, "args");
            if (this.Mode == "webedit")
                base.OnCancel(sender, args);
            else
                SheerResponse.Eval("scCancel()");
        }

        protected string Mode
        {
            get
            {
                string str = StringUtil.GetString(base.ServerProperties["Mode"]);
                if (!string.IsNullOrEmpty(str))
                    return str;
                return "shell";
            }
            set
            {
                Assert.ArgumentNotNull(value, "value");
                base.ServerProperties["Mode"] = value;
            }
        }
    }
}

Lastly, we’ll need to go update the RichText Commands.js located within website\sitecore\shell\Controls\Rich Text Editor.

RadEditorCommandList["QuoteBig"] = function (commandName, editor, args) {
var html = editor.getSelectionHtml();
scEditor = editor;
editor.showExternalDialog(
"/sitecore/shell/default.aspx?xmlcontrol=RichText.QuoteBig&la=" + scLanguage + "&selectedText=" + escape(html),
null,
500, //width
200, //height
scInsertQuote, //callback
null,
"Insert Quote",
true, //modal
Telerik.Web.UI.WindowBehaviors.Close, // behaviors
false, //showStatusBar
false //showTitleBar
);
};</code>

function scInsertQuote(sender, returnValue) {
if (!returnValue) {
return;
}
scEditor.pasteHtml(returnValue.text, "DocumentManager");
}

Be sure and clear your sitecore cache and test in a private browsing window to ensure you're getting all of your changes. That should be all it takes!