Go Back   vb.org Archive > vBulletin Article Depository > Read An Article > vBulletin 4 Articles
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools
[HOW-TO - vB4] Create a Custom Button for CK Editor (no file edits)
cellarius's Avatar
cellarius
Join Date: Aug 2005
Posts: 1,987

 

Show Printable Version Email this Page Subscription
cellarius cellarius is offline 02-18-2012, 11:00 PM

This article explains how to add or remove buttons from CKEditor by using Ckeditor and vBulletin plugins. No standard file edits needed.

To add a button to CKEditor, you need to create a CKE plugin. This is an example code for such a plugin. It will add "Hello World" to the editor and spawn a JS alert.
Important note: This article is on the technique of adding a button, not on how you will get your button to do whatever it is you want it to do. There are plenty sites out there that give support for CKEditor plugins. The CKE API documentation can be found here.



First step: Create the CKEditor plugin

The editor plugin files reside in the folder [forumroot]/clientscript/ckeplugins. Create a new folder in there. For the purpose of this article, I'll name it celButtonDemo. Inside that folder, create a file called plugin.js. So you end up with this:
[forumroot]/clientscript/ckeplugins/celButtonDemo/plugin.js
Important note: Please take notice that "celButtonDemo" will have to be replaced in the folder name and in the following code examples accordingly!.

Inside plugin.js goes the plugin code:
Code:
CKEDITOR.plugins.add( 'celButtonDemo',
{
	init : function( editor )
	{
		// This adds the button
		editor.ui.addButton('celButtonDemo',
		{
			// label: adds a hover text to the button. This uses the vBulletin
			// phrase "celButtonDemo" which you will have to add to your phrases
			// and to pass to CKE in a plugin
			label : editor.config.vbulletin.phrase.celButtonDemo,
			// command: the command that will be executed. It's defined later
			// in this file
			command : 'celButtonDemo',
			// icon: The path to the icon file you want to use for your button.
			// Here we use buttonimage.png in the buttons directory defined for
			// the current style (default: /images/editor)
			icon: BBURL + '/' + IMGDIR_BUTTON + '/celButtonDemo.png',
		});

		// This defines the command that's executed when the button is clicked
		editor.addCommand('celButtonDemo',
		{
			// modes: decide in what editor modes the button will be active;
			// set to 0 to grey it out
			modes : { enhancedsource:1, wysiwyg:1 },
			// Execute your JS Code - CKE offers a great API:
			exec: function(editor){
				alert('Hello world!');
				editor.insertHtml( 'Hello World! - Hello World!' );
			}
		});
	}
});


Second step: vB Operations - register your button, add it to the toolbar, and more

In a second step we will create two vB plugins and a vB phrase. You should bundle all that together to a product, to have it all nicely together.

Let's start with the phrase: Go to AdminCP, create a phrase in the CKEditor phrase group, and name it CelButtonDemo. Enter "Hello World, hello Button" - or whatever. Save. Done.

Then create a new plugin at hook "editor_construct". This will add our button to the CKE configuration.

PHP Code:
// Add our button to the extra plugins loaded
$this->config['_extraPlugins'] .= ',celButtonDemo';
// Register our phrase for the label of our button (see second step)
$this->config['vbulletin']['phrase']['celButtonDemo'] = $this->vbphrase['celButtonDemo']; 
OK, now let's create the second plugin at hook "editor_toolbar_filter":
In this example, our button will be inserted after the Quote-Button. Your options to place the button can be found in /vb/ckeditor.php. See line 7 in the following code:

PHP Code:
foreach ($toolbar AS &$row)
{
    if (
is_array($row))
    {
        foreach (
$row AS $id => $cmd)
        {
            if (
$cmd == 'Quote')
            {
                
$row array_merge(array_slice($row0$id+1),  array('celButtonDemo'), array_slice($row$id+1));
                break;
            }
        }
    }

Last, not least, we need a nice little icon for our button. Upload that to /images/buttons and name it celButtonsDemo.png. Dimensions: 21x21 px.



Result (Screencast):
http://screencast-o-matic.com/watch/clnqDcazQ



Removing buttons

The technique used above to add the button can also be used to remove a button. Example: Removing the image button would look like that (hook "editor_toolbar_filter")

PHP Code:
foreach ($toolbar AS &$row)
{
    if (
is_array($row))
    {
        foreach (
$row AS $id => $cmd)
        {
            if (
$cmd == 'Image')
            {
                
array_splice($row,$id,1);
                break;
            }    
        }
    }

Please note that removing the button will not render the attached bbcode inactive! However, you can use
PHP Code:
$this->config['_removePlugins'] .= ',celButtonDemo'
at hook editor_construct to remove plugins.



Restricting buttons by editor-mode or usergroup

You have everything available to you in the vB-universe to restrict access to your button, just extend the if-condition. You can restrict by usergroup, or you can show a button only in a certain editor

The editor mode can be queried via $this->editor_type in plugins at editor_toolbar_filter:
fe = full
qr = quick reply
qe = quick edit
cms_article

Example:

PHP Code:
foreach ($toolbar AS &$row)
{
    
// Condition extended: show new button only to Mods, Supermods, Admins and
    // only in Quick Reply Editor:
    
if (is_array($row) AND is_member_of($vbulletin->userinfo['usergroupid'], 567) AND $this->editor_type == 'qr' )
    {
        foreach (
$row AS $id => $cmd)
        {
            if (
$cmd == 'Quote')
            {
                
$row array_merge(array_slice($row0$id+1),  array('celButtonDemo'), array_slice($row$id+1));
                break;
            }
        }
    }


Have fun!
cellarius
.
.
Reply With Quote
  #12  
Old 07-02-2012, 05:58 AM
cellarius's Avatar
cellarius cellarius is offline
 
Join Date: Aug 2005
Posts: 1,987
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Yes.
Reply With Quote
Благодарность от:
cstreater
  #13  
Old 07-02-2012, 05:59 AM
cstreater cstreater is offline
 
Join Date: May 2010
Posts: 48
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thanks. Got it working great.
Reply With Quote
Благодарность от:
cellarius
  #14  
Old 07-02-2012, 07:20 AM
Badshah93 Badshah93 is offline
 
Join Date: Jun 2010
Location: India
Posts: 505
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by cstreater View Post
Great article, and I was able to accomplish what I wanted to accomplish for a single button. However, what if I wanted to add 3-4 buttons? Do I need to create unique JS files and plug-in's for each?
you can do it with one js file also, like i have done it in this mod.
Code:
https://vborg.vbsupport.ru/showthread.php?t=282328
Reply With Quote
Благодарность от:
cstreater
  #15  
Old 07-02-2012, 09:37 PM
cstreater cstreater is offline
 
Join Date: May 2010
Posts: 48
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Badshah93 View Post
you can do it with one js file also, like i have done it in this mod.
Code:
https://vborg.vbsupport.ru/showthread.php?t=282328
This is awesome. Thanks to both of you
Reply With Quote
  #16  
Old 07-04-2012, 11:21 PM
cstreater cstreater is offline
 
Join Date: May 2010
Posts: 48
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Back again -- I can't get this permissions piece of the code to work:

Code:
if (is_array($row) AND is_member_of($vbulletin->userinfo['usergroupid'], 5, 6, 7) AND $this->editor_type == 'qr' )
If I include that line, the code that follows does not execute for anyone, regardless of group. I've been trying to figure this out for a while now, and I'm totally stuck.
Reply With Quote
  #17  
Old 12-14-2012, 08:08 PM
LOGECT's Avatar
LOGECT LOGECT is offline
 
Join Date: Jun 2010
Location: Copenhagen
Posts: 117
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

thanks, this is very useful.
Is there any way to use {vb:raw vboptions.xxx} in plugin.js ?
Reply With Quote
  #18  
Old 01-08-2013, 09:40 PM
DefiantComplex DefiantComplex is offline
 
Join Date: May 2012
Posts: 16
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Lets say i already have a bbcode, for example the [ hide ] for the dbtech post thanks mod.
How would i add it in this example?
Reply With Quote
  #19  
Old 05-14-2013, 03:48 PM
root2012 root2012 is offline
 
Join Date: Oct 2012
Posts: 40
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

PHP Code:
foreach ($toolbar AS &$row

    if (
is_array($row)) 
    { 
        foreach (
$row AS $id => $cmd
        { 
            if (
$cmd == 'Image'
            { 
                
array_splice($row,$id,1); 
                break; 
            }     
        } 
    } 

how is it possible to remove several button ?????
Reply With Quote
  #20  
Old 05-20-2013, 02:22 AM
root2012 root2012 is offline
 
Join Date: Oct 2012
Posts: 40
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Unfortunately, no support here more or?????
Reply With Quote
  #21  
Old 06-08-2013, 05:56 PM
Typhon Typhon is offline
 
Join Date: Oct 2001
Location: Atlanta, GA
Posts: 37
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I can't seem to get this to work ... did something change between 4.2 and 4.2.1?
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 08:27 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.05002 seconds
  • Memory Usage 2,356KB
  • Queries Executed 27 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (4)bbcode_code
  • (6)bbcode_php
  • (2)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)modsystem_article
  • (1)navbar
  • (4)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (3)pagenav_pagelink
  • (11)post_thanks_box
  • (21)post_thanks_box_bit
  • (11)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (4)post_thanks_postbit
  • (11)post_thanks_postbit_info
  • (10)postbit
  • (11)postbit_onlinestatus
  • (11)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • fetch_musername
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • post_thanks_function_fetch_thanks_bit_start
  • post_thanks_function_show_thanks_date_start
  • post_thanks_function_show_thanks_date_end
  • post_thanks_function_fetch_thanks_bit_end
  • post_thanks_function_fetch_post_thanks_template_start
  • post_thanks_function_fetch_post_thanks_template_end
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete