CKEditor

The build in editor CKEditor has a quite powerful plugin system. It can be used to create additional toolbar-buttons and dialogs. Sulu gives you the ability to add these as plugins to your bundle.

Example

The code for this example was “borrowed” from http://docs.ckeditor.com/#!/guide/plugin_sdk_sample_1.

1. Create a plugin file

define(function() {
    return function(sandbox) {
        return {
            // The plugin initialization logic goes inside this method.
            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.pluginDefinition.html#init
            init: function( editor )
            {
                // Define an editor command that inserts an abbreviation.
                // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.editor.html#addCommand
                editor.addCommand( 'abbrDialog',new CKEDITOR.dialogCommand( 'abbrDialog' ) );
                // Create a toolbar button that executes the plugin command.
                // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.ui.html#addButton
                editor.ui.addButton( 'Abbr',
                {
                    // Toolbar button tooltip.
                    label: 'Insert Abbreviation',
                    // Reference to the plugin command name.
                    command: 'abbrDialog',
                    // Button's icon file path.
                    icon: this.path + 'images/icon.png'
                } );
                // Add a dialog window definition containing all UI elements and listeners.
                // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html#.add
                CKEDITOR.dialog.add( 'abbrDialog', function ( editor )
                {
                    return {
                        // Basic properties of the dialog window: title, minimum size.
                        // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.dialogDefinition.html
                        title : 'Abbreviation Properties',
                        minWidth : 400,
                        minHeight : 200,
                        // Dialog window contents.
                        // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.definition.content.html
                        contents :
                        [
                            {
                                // Definition of the Basic Settings dialog window tab (page) with its id, label, and contents.
                                // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.contentDefinition.html
                                id : 'tab1',
                                label : 'Basic Settings',
                                elements :
                                [
                                    {
                                        // Dialog window UI element: a text input field for the abbreviation text.
                                        // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.ui.dialog.textInput.html
                                        type : 'text',
                                        id : 'abbr',
                                        // Text that labels the field.
                                        // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.ui.dialog.labeledElement.html#constructor
                                        label : 'Abbreviation',
                                        // Validation checking whether the field is not empty.
                                        validate : CKEDITOR.dialog.validate.notEmpty( "Abbreviation field cannot be empty" )
                                    },
                                    {
                                        // Another text input field for the explanation text with a label and validation.
                                        type : 'text',
                                        id : 'title',
                                        label : 'Explanation',
                                        validate : CKEDITOR.dialog.validate.notEmpty( "Explanation field cannot be empty" )
                                    }
                                ]
                            },
                            {
                                // Definition of the Advanced Settings dialog window tab with its id, label and contents.
                                id : 'tab2',
                                label : 'Advanced Settings',
                                elements :
                                [
                                    {
                                        // Yet another text input field for the abbreviation ID.
                                        // No validation added since this field is optional.
                                        type : 'text',
                                        id : 'id',
                                        label : 'Id'
                                    }
                                ]
                            }
                        ],
                        // This method is invoked once a user closes the dialog window, accepting the changes.
                        // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.dialogDefinition.html#onOk
                        onOk : function()
                        {
                            // A dialog window object.
                            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html
                            var dialog = this;
                            // Create a new abbreviation element and an object that will hold the data entered in the dialog window.
                            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dom.document.html#createElement
                            var abbr = editor.document.createElement( 'abbr' );

                            // Retrieve the value of the "title" field from the "tab1" dialog window tab.
                            // Send it to the created element as the "title" attribute.
                            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dom.element.html#setAttribute
                            abbr.setAttribute( 'title', dialog.getValueOf( 'tab1', 'title' ) );
                            // Set the element's text content to the value of the "abbr" dialog window field.
                            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dom.element.html#setText
                            abbr.setText( dialog.getValueOf( 'tab1', 'abbr' ) );

                            // Retrieve the value of the "id" field from the "tab2" dialog window tab.
                            // If it is not empty, send it to the created abbreviation element.
                            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html#getValueOf
                            var id = dialog.getValueOf( 'tab2', 'id' );
                            if ( id )
                                abbr.setAttribute( 'id', id );

                            // Insert the newly created abbreviation into the cursor position in the document.
                            // http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.editor.html#insertElement
                            editor.insertElement( abbr );
                        }
                    };
                } );
            }
        };
    };
});

2. Register your new plugin

In the main.js file of your bundle you can require the newly created plugin and register it through the initialize function.

sandbox.ckeditor.addPlugin(
    'my-toolbar',  // which toolbar should include the button
    'Abbr',        // name of toolbar-button defined in the plugin
    'abbr',        // Name of plugin
    new Abbr(app.sandboxes.create('plugin-abbr'))
);

You can now use your plugin in all Ckeditor instances.

Note

To create your overlays or other plugins in our aura-system you can also use the sandbox to start your own component. But you have to be sure that you did stop all your components to reduce the memory-usage and calls to the event-system.