Here’s a quick one if you are in need of a noon-time distraction. If you’ve ever used the WYSIWYG editor TinyMCE, called “tiny mice” by some, then you know that it likes to
hook()
up with every that it sees.
The results of this promiscuity range from annoying (I don’t need a HTML editor for a log message!) to the disastrous (?*$! That HTML editor just stripped the newlines from my list of pages in “Page specific visibility settings!” Oh, the humanity!)
The fix for this is hinted at in the docs of TinyMCE. You can specify a list of named textarea
s for TinyMCE to ignore from inside the theme function, phptempate_tinymce_theme()
. For each named , you can unset the TinyMCE
$init
. Which is somewhat useful, but everytime you add a new module, you’ll find a new list of s that get screwed up.
However, to really control TinyMCE, we can turn that logic on its head. If we use that theme function to specify a list of named s that will pass untouched through the function (meaning TinyMCE will hook up with them) and unset the TinyMCE init for all other
s. Here’s the code:
And voila! TinyMCE will now only hook up with node bodies, block bodies and comments.
Comments3
Something similar
Hey I've done something similar, and I notice your code removes the logic in the default theme_tinymce_theme(). You might be better off calling it instead of simply using $init untouched. Here's what I've used...
<?php
/**
* Override theme_tinymce_theme. This control which textareas have
* the tinymce editor applied to them. See tinymce module README.TXT
* for more information.
*/
function phptemplate_tinymce_theme($init, $textarea_name, $theme_name, $is_running) {
// default theme_tinymce_theme enables tinymce by default, and
// supresses on certain textareas. Our implementation disables by
// default, and allows only on the following textareas.
if (in_array($textarea_name, array('body',
'formnode-data-submit-body',
'mn-data-header',
'mn-data-footer',
'signature',
'site_mission',
'site_footer',
'site_offline_message',
'page_help',
'user_registration_help',
'user_picture_guidelines',
))) {
// Prevent tinymce from mucking up our paths
$init['convert_urls'] = 'false';
$returnMe = theme_tinymce_theme($init, $textarea_name, $theme_name, $is_running);
return $returnMe;
}
else
// disable tinymce
return NULL;
}
?>
I've used tinymce on only one project and don't plan to ever use it again. It has nasty habits like inserting silly <br type="_moz" /> tags.
By design
The only logic that
theme_tinymce_theme()
performs is “Force the 'simple' theme for some of the smaller textareas.” But my function only enables TinyMCE for 3 textareas, and none of them are in that list of “smaller textareas” so its totally unnecessary to call it.But if anyone is thinking of using the technique I outlined, they should, of course, review the
theme_tinymce_theme()
code in the tinymce.module file.Even usually don't use
Even usually don't use tinymce, this could be really nice trick.
Thanks.