Крошечный MCE, добавляющий собственные HTML-теги

Я использую Tiny 4.3.3 для MODx, мне нужно добавить

<p class="classname">
 <em class="openImg"></em>
  Some randome Input text by the user
 <em class="closeImg"></em>
</p>

Я не возражаю, если это дополнительный пункт меню или он находится в раскрывающемся меню абзаца. Я просто хочу, чтобы работа была менее трудоемкой.

Я пробовал этот http://alexzag.blogspot.co.uk/2009/12/custom-tags-in-tinymce.html, но почему-то это не работает.

Может ли кто-нибудь указать мне на хороший учебник или рассказать, как я могу добавить значок или имя в раскрывающееся меню, которое автоматически создает теги p и em с правильными классами? Спасибо


person Jonathan Thurft    schedule 14.03.2013    source источник


Ответы (2)


Прошло некоторое время с тех пор, как этот вопрос был задан, но, поскольку я сейчас делаю то же самое, я подумал, что поделюсь своими открытиями и решениями по этому поводу. :)

Я расширяю TinyMCE для тестового проекта на работе, и нашему решению нужны настраиваемые теги - в некоторых из них пользователь должен иметь возможность вводить только одну строку, в других (как ваш em) много текст.

Шаги, которые необходимо сделать для достижения желаемого решения:

  • Сообщите редактору TinyMCE, что ваши элементы хороши, используя два ключевых слова конфигурации extended_valid_elements и custom_elements:

    tinymce.init({ selector: "textarea#editor", // ... extended_valid_elements : "emstart,emend", custom_elements: "emstart,emend", content_css: "editor.css" });

  • создайте два изображения для открывающего и закрывающего тегов. Я назвал свой в качестве примера emstart.png и emend.png.

  • создайте собственный стиль CSS для ваших пользовательских элементов и поместите их в пользовательский файл CSS (тот, который указан в конфигурации TinyMCE, в моем случае editor.css):

    emstart { background: url(emstart.png) no-repeat; background-position: left -3px top -3px; padding: 10px 10px 5px 10px; background-color:#aabbcc; border:1px dotted #CCCCCC; height:50px; width:100px; }

    emend { background: url(emend.png) no-repeat; background-position: left -3px bottom -3px; padding: 5px 10px 10px 10px; background-color:#aabbcc; border:1px dotted #CCCCCC; height:50px; width:100px; }

  • напишите собственный плагин, который вводит новые теги и помещает его в каталог плагинов. Я позвонил своему customem:

код плагина:

tinymce.PluginManager.add('customem', function(editor, url) {
    // Add a button that opens a window
    editor.addButton('customEmElementButton', {
        text: 'Custom EM',
        icon: false,
        onclick: function() {
            // Open window
            editor.windowManager.open({
                title: 'Please input text',
                body: [
                    {type: 'textbox', name: 'description', label: 'Text'}
                ],
                onsubmit: function(e) {
                    // Insert content when the window form is submitted
                    editor.insertContent('<emstart>EM Start</emstart><p>' + e.data.description + '</p><emend>EM End</emend>');
                }
            });
        }
    });

    // Adds a menu item to the tools menu
    editor.addMenuItem('customEmElementMenuItem', {
        text: 'Custom EM Element',
        context: 'tools',
        onclick: function() {
            editor.insertContent('<emstart>EM Start</emstart><p>Example text!</p><emend>EM End</emend>');
        }
    });
});

Последний шаг - загрузить ваш собственный плагин в редактор (используя параметр конфигурации плагин и панель инструментов) и наслаждаться результатом:

    tinymce.init({
        selector: "textarea#editor",
        height: "500px",
        plugins: [
                 "code, preview, contextmenu, image, link, searchreplace, customem"
           ],
        toolbar: "bold italic | example | code | preview | link | searchreplace | customEmElementButton",
        contextmenu: "bold italic",
        extended_valid_elements : "emstart,emend",
        custom_elements: "emstart,emend",
        content_css: "editor.css",
     });

Теперь редактор выглядит так:

введите описание изображения здесь

и источник, как в вашем примере:

введите описание изображения здесь

person keenthinker    schedule 05.03.2014
comment
Большое спасибо ! Такое сокровище. Интересно, а почему в документ не помещают такой пример ... а может я его пропустил? - person GLAND_PROPRE; 26.06.2016
comment
Рад, что ответ помог. По крайней мере, на момент написания ответа я думаю, что это было больше похоже на понимание большего изображения и сопоставление фактов (и экспериментирование) - AFAIK нет такого примера в документации. - person keenthinker; 26.06.2016
comment
Здравствуйте, в настоящее время я борюсь с реализацией пользовательских компонентов Vue внутри редактора, например <swipper :options="optionSet1"></swipper> он просто удаляет все, то же самое для директив vue, таких как <div v-swipr:swiper="set1"></div>, удаляется <div></div> за любую полезную помощь, вы также можете пригласить меня в чат, если хотите. - person Badgy; 14.12.2018
comment
Здравствуйте, я хотел спросить, знаете ли вы, как это сделать для углового компонента? Я добавляю это tinymce.init({ selector: '.page', inline: true, extended_valid_elements: "app-my-block", custom_elements: "app-my-block", }); в коде, но tiny не видит его как компонент. - person qwerty; 08.11.2019
comment
@qwerty проверяет, находится ли элемент уже в DOM до инициализации tinymce, не то, что tinymce инициализирован, но элемент еще не присутствует. Где и когда вызывается метод init? полная страница уже загружена / создана? - person keenthinker; 10.11.2019
comment
@keenthinker Отличный пример, но после этого у меня возникла другая проблема. В окне редактора нажмите кнопку Custom EM и загрузите пользовательские элементы. Теперь в окне редактора наш кастомный элемент является самым первым элементом. Теперь переместите курсор в самое начало окна редактора и попробуйте добавить другие элементы или просто нажмите Enter. Все вновь добавленные элементы будут отображаться ВНУТРИ этих настраиваемых элементов, но когда мы переместили курсор перед настраиваемыми элементами, эти вновь добавленные элементы должны отображаться до и снаружи настраиваемых элементов. - person sunil20000; 16.02.2021
comment
@keenthinker ниже - это вопрос с более подробной информацией относительно описанного выше сценария: stackoverflow.com/questions/66219539/ - person sunil20000; 16.02.2021

Прежде всего вам необходимо изменить настройку tinymce valid_elements и valid_children к вашим потребностям (добавьте em к valid_elements и em as дочерний элемент к желаемым тегам (вероятно, от p) до valid_children).

Во-вторых, вам понадобится собственный плагин с собственным раскрывающимся списком или кнопкой для вставки этого кода.

person Thariama    schedule 14.03.2013