Положение дел с существующими онлайн WYSIWYG редакторами таково, что не один из них не работает идеально. Глючат, вставляют лишние переводы строк и т д. А самое главное не делают некоторых нужных вещей, или делают не так. Но разве это проблема? мы ведь с вами программисты, а код редакторов открыт!
Правда, решая эту проблему некоторые мои коллеги бодро лезут в код редактора, очень бысто успокаиваясь в нагромождении сжатого JavaScript. Как правило лучше программа от такого хирургического вмешательства работать не начинала. Между тем есть вполне нормальный способ добавить в редактор нужный функционал - написать к нему плагин. Чем сейчас и займёмся.
Сама задача - обеспечить возможность вставки втекст гиперссылки. Конечно, в TinyMCE она давно решена, с помощью плагина advlink, номне нужны были специальные ссылки из ограниченного набора url. Впрочем на этом я останавливаться не буду, давайте сначала просто реализуем вставку ссылок. Плагин будет называться mics_link.
Структура плагина для TinyMCE, находящегося в папке tiny_mce/plugins/, следующая:
- /css
- Специфичные для данного плагина CSS.
- /img
- Тут всё понятно.
- /js
- Скрипты, обрабатывающие данные диалоговой формы плагина. Можно сказать реализация бизнес логики =).
- /langs
- Словари для локализации. каждому языку тут соответствуют два файла:
- en.js - здесь содержиться описание плагина, появляющееся при наведении курсора на его иконку в интерфейсе редактора.
- en_dlg.js - здесь все языковые опции в надписях форм, диалогов, в общем всё остальное.
- /editor_plugin.js
- Скрипт управляющий загрузкой плагина и поведением диалогового окна. (код в сжатом виде)
- /editor_plugin_src.js
- Тоже самое, только не в сжатом виде.
- /somedialog.htm
- HTML представления диалогового окна плагина.
Из всего этого единственным обязательным файлом является editor_plugin.js. При работе плагина выполняется именно он, но как было сказано выше JavaScript в нём упакован и работать с таким кодом довольно затруднительно. Поэтому и существует его несжаты й двойник - editor_plugin_src.js.
Теперь хорошая новость - все эти папки и файлы нам с нуля создавать не надо. В один из плагинов TinyMCE - example, представляет собой шаблон для изготовления своего плагина.
Сохраним папку plugins/exampl поднужным нам названием (у меня plugins/mics_link) и займёмся редактированием editor_plugin_src.js
Шаблон для плагина, в упрощённом виде выглядит следующим образом:
(function() { // Lзагружаем языковый пакет tinymce.PluginManager.requireLangPack('mics_link'); tinymce.create('tinymce.plugins.MicsLink', { /** * инициализируем плагин * ed - экземляр редактора * url - абсолютный url плагина */ init : function(ed, url) { // Регестрирум комаду, для открытия окна плагина ed.addCommand('mceMics', function() { // параметры окна ed.windowManager.open({ file: url + '/dialog.htm', width: 320 + ed.getLang('mics_link.delta_width', 0), height: 120 + ed.getLang('mics_link.delta_height', 0), inline: 1 }, { // данные для плагина - его абсолютный URL // и аргументы (ели они нужны) plugin_url : url, some_custom_arg : 'custom arg' }); }); // регестрируем иконку плагина ed.addButton('mics_link', { title: 'mics_link.desc', cmd: 'mceMics', image: url + '/img/mics_link.gif' }); ed.onNodeChange.add(function(ed, cm, n) { cm.setActive('mics_link', n.nodeName == 'IMG'); }); }, createControl : function(n, cm) { return null; }, // "Выходные данные" плагина getInfo : function() { return { longname : 'Mics Link Plugin', author: 'Geol', authorurl: 'http://webgeol.blogspot.com/', version: "1.0" }; } }); // Регестрируем плагин tinymce.PluginManager.add('mics_link', tinymce.plugins.MicsPlugin); })();
Небольшие пояснения (хотя я почти всё написал комментариях).
Сначала мы загружаем файлы локализации. Потом вызывается метод tinymce.create(), который создает экземпляр класса нашего плагина. Затем, в финкции, вызываемой при инициализации плагина, регестрируем комманду mceMics, загружающею плагин. методом addButton мы добавляем пиктограммудля панели инструментов редаактора и связываем с ний команду (разумеется иконка пиктограммы должна быть создана и помещена в папку image/ плагина.
Секцию createControl мы сейчас расмтривать не будем (она нужна для создания элементов управления более сложных чем кнопки), ну а в getInfo помещаются сведения об авторе и версии плагина.
Теперь нужно превратить этот скрипт в неудобоваримый вид, то есть сжать JavaScript и сохранить под именем editor_plugin.js (исполняться будет именно он, незжатый аналог нужен только для удобного редактирования). Для этого мы воспользуемся утилитой JavaScript Comressor (http://javascriptcompressor.com/ Рис 1)
Теперь нужно превратить этот скрипт в неудобоваримый вид, то есть сжать JavaScript и сохранить под именем editor_plugin.js (исполняться будет именно он, незжатый аналог нужен только для удобного редактирования). Для этого мы воспользуемся утилитой JavaScript Comressor (http://javascriptcompressor.com/ Рис 1)
Рис 1
"Компилируем" код
Теперь редактируем somedialog.htm. Для начала переименуем его в mics_link.php, в соответствии с названием плагина (строго говоря это не обязательно, но таковы рекомендации). Теперь верстаем нашу форму.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>{#micslink_dlg.title}</title> <script type="text/javascript" src="../../tiny_mce_popup.js"> </script> <script type="text/javascript" src="js/dialog.js"> </script> </head> <body> <form onsubmit="MicslincDialog.insert();return false;" action="#"> <p>Вставка гиперссылки.</p> <p>Текст ссылки: <input id="mtext" name="mtext" type="text" class="text" /></p> <p>URL: <input id="mhref" name="mhref" type="text" class="text" /></p> <select id="targ" name="targ" onchange="this.form.targ.value=this.options[this.selectedIndex].value;"> <option value="1"> В этом фрейме </option> <option value="2"> В новом окне </option> </select> <div class="mceActionPanel"> <input type="button" id="insert" name="insert" value="{#insert}" onclick="ExampleDialog.insert();" > <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" /> </div> </form> </body> </html>Теперь нужно написать обработчик формы. Он довольно прост и находится в в файле /js/dialog.js:
tinyMCEPopup.requireLangPack(); var MicsDialog = { init : function() { var f = document.forms[0]; f.mtext.value = tinyMCEPopup.editor.selection.getContent({ format : 'text' }); f.mhref.value = ''; }, insert : function() { if(document.forms[0].targ.value==1){ tr='target=_self'; } else { tr='target=_blank'; } mlink= "<a "+tr+" href="+document.forms[0].mhref.value+">"; mlink+= document.forms[0].mtext.value+"</a>"; tinyMCEPopup.editor.execCommand('mceInsertContent', false, mlink); tinyMCEPopup.close(); } }; tinyMCEPopup.onInit.add(MicsDialog.init, MicsDialog);
Что мы натворили (а точнее слегка изменили шаблонный скрипт)?
Последней строкой мы добавляем в обработчик onInit, вызываемый при инициализации объекта tinyMCEPopup, вызов метода init, только что созданного объекта MicsDialog. Этот метод устанавливает начальные значения полей формы. В поле текста помещает выделенный в редакторе текст, а полю URL присваивает пустое значение. (Зачем нужно последнее? В дальнейшем (за пределами этой статьи), мы неприменно расширим функционал пплагина для работы по изменению уже созданных гиперссылок.)
Метод inser, вызываемый по нажатию соответствующей кнопки на нашей форме, формирует гиперссылку. и вызывает два метода tinyMCEPopup. Это tinyMCEPopup.editor.execCommand(), вставляющий сформированный контент в текст документа, и tinyMCEPopup.close(), закрывающий вслывающее окошко с нашей формой.Всё, плагин готов. Осталось не забыть про него при вызове редактора. Для этого, в код вызова редактора включаем соответсвующие пункты:
tinyMCE.init({ // General options mode : "textareas", theme : "advanced", plugins : "mics_link, safari,syntaxhl,pagebreak,spellchecker,style,layer,..."
Тут мы включили наш плагин, теперь разместим кнопку вызова на панели редактора:
// Theme options theme_advanced_buttons1 : "spellchecker,syntaxhl,mics_link,|,...", theme_advanced_buttons2 : "cut,cop ..."Теперь запускаем редактор. На панели инструментов должна отобразиться новая иконка (Рис 2)
Рис 2
Иконка запуска плагина появилась на панели инструментов
При клике на неё откроется и сам плагин (рис 3)
Хорошая статейка, помогла в работе ;)
ОтветитьУдалитьЖду продолжения... ))
ОтветитьУдалитьПостараюсь разродиться на этой неделе.
ОтветитьУдалитьсделал, точнее скопировал, по Вашей статье плагин.
ОтветитьУдалитьв опере перестает отображать все плагины ВООБЩЕ, а в IE просто тупо его нет )=
опера: http://savepic.org/762630.htm
IE: http://savepic.org/740127.htm
а вот и код: http://savepic.org/743199.htm
Судя по всему какая-то беда с подключением плагина. Есть пль JavaScript ошибки? Изчезает -ли пробле ма в опере, если подключить плагин, но не помещать его в тулбар?
ОтветитьУдалитьИ доступна-ли иконка? вроде дело именно в этом.
ОтветитьУдалитьпроблема не исчезла.tinyMCE скачен с офсайта
ОтветитьУдалитьи иконка не доступна
ОтветитьУдалитьтак может она неправипльно прописана? или просто прав на файл не хватает?
ОтветитьУдалитьправ не хватает? о_О
ОтветитьУдалитьНу вы ведь закачивали иконку дпля своего плагина? Достаточно ли прав у веб сервера, чтобы отдавать её?
ОтветитьУдалитьСпасибо очень большое!!! Код по какой то причине не заработал?!! Но статья в целом подсказала куда копать. Уже написал плагин для вставки изображений. Всё кратко и лаконично. Побольше бы таких статей!!!
ОтветитьУдалитьzZiron: У тебя в самом начале ошибочка. Ты регаешь MicsPlugin а создаешь MicsLink, исправь. Спасибо большое за пример, по трахаться конечно пришлось, так как я вообще не веб разработчик, а просто решил прикрутить TinyMCE к 1C, но всё равно огромное спасибо
ОтветитьУдалитьКому еще актуально вот где проблема была MicsLinkPlugin (а конкретней Plugin)
ОтветитьУдалитьtinymce.create('tinymce.plugins.MicsLinkPlugin'
tinymce.PluginManager.add('mics_link', tinymce.plugins.MicsLinkPlugin);
вроде после такого как раз должен заработать