Как получить содержимое редактора TinyMCE при использовании на фронтенде?

17 февр. 2012 г., 08:40:30
Просмотры: 36.2K
Голосов: 8

Я не уверен, почему не смог найти это, но кто-нибудь знает, как получить содержимое редактора TinyMCE? Я использую его на фронтенде и хочу иметь возможность сохранять то, что пользователь набрал в TinyMCE, в базу данных, но не могу найти лучший способ получить это значение.

Два решения, которые я реализовал с некоторым успехом:

  1. tinyMCE.activeEditor.getContent(); - Этот метод, похоже, получает значение только из визуального редактора, поэтому если я нахожусь в HTML-редакторе и вношу изменения, а затем сохраняю, они не фиксируются.

  2. $('#html_text_area_id').val(); - Этот метод противоположен первому, он, похоже, получает значение только из HTML-редактора.

Я знаю, что есть лучший способ - я просто не могу его найти...

P.S. Да, я собираюсь реализовать меры безопасности, чтобы люди не могли разрушить базу данных.

2
Комментарии

Когда вы инициализируете tinyMCE, обычно вы привязываете его к textarea, поэтому просто используйте id этой textarea с методом val() jQuery.

Bainternet Bainternet
17 февр. 2012 г. 09:32:41

Да, я пробовал это, но получаю значение только из HTML-редактора. Если я нахожусь в визуальном редакторе, вношу изменения, а затем пытаюсь сохранить, то все изменения, сделанные в визуальном редакторе, не сохраняются.

Sam Sam
17 февр. 2012 г. 22:49:19
Все ответы на вопрос 6
6
23

Оказывается, WordPress отслеживает тип активного редактора (визуальный или HTML) с помощью класса, который добавляется к обертке контента. Вот решение, которое позволит получить последнее содержимое редактора:

function get_tinymce_content(){
    if (jQuery("#wp-content-wrap").hasClass("tmce-active")){
        return tinyMCE.activeEditor.getContent();
    }else{
        return jQuery('#html_text_area_id').val();
    }
}
17 февр. 2012 г. 23:12:30
Комментарии

Хм, интересная идея. Я протестирую это и отпишусь о результатах. Спасибо!

Sam Sam
18 февр. 2012 г. 01:48:55

Сработало идеально. Спасибо за помощь! Если бы у меня было достаточно репутации, я бы проголосовал за это.

Sam Sam
18 февр. 2012 г. 19:27:56

Рад, что всё получилось. Вы можете принять ответ как правильный, и этого будет достаточно :)

Bainternet Bainternet
18 февр. 2012 г. 20:09:25

Мне потребовалось много времени, чтобы найти ответ на этот вопрос. Мне также нужен был способ установки содержимого. Если кому-то еще нужен способ установки содержимого, вот Gist с обеими функциями (get/set): https://gist.github.com/RadGH/523bed274f307830752c. Это также работает с пользовательскими ID wp_editor, а не только со стандартными.

Radley Sustaire Radley Sustaire
17 июл. 2014 г. 21:46:21

Тоже очень помогло ;)

Vignesh Pichamani Vignesh Pichamani
15 окт. 2014 г. 14:37:55

У меня это не сработало. Однако это дало мне идею о том, как этого можно достичь. В отдельном ответе я использовал концепцию этого ответа для определения активной вкладки, но использовал цвет фона в качестве идентификатора.

Abel Melquiades Callejo Abel Melquiades Callejo
15 дек. 2015 г. 22:43:29
Показать остальные 1 комментариев
0

Это код, который я добавил в свой JavaScript, прямо перед отправкой формы.

// Находим и перебираем все редакторы TinyMCE.
jQuery('#the-form').find( '.wp-editor-area' ).each(function() {
    var id = jQuery( this ).attr( 'id' ),
        sel = '#wp-' + id + '-wrap',
        container = jQuery( sel ),
        editor = tinyMCE.get( id );

    // Если редактор находится в режиме "визуального" редактирования, нужно выполнить действия.
    if ( editor && container.hasClass( 'tmce-active' ) ) {
        // Сохраняет содержимое редактора в текстовое поле:
        editor.save();
    }
});
2 авг. 2014 г. 17:54:35
1

Это сработало для меня:

if (jQuery("#wp-description-wrap").hasClass("tmce-active")){
    description1 = tinyMCE.activeEditor.getContent( { format : 'html' } );
}else{
    description1 = jQuery('[name="description"]').val();

Где description — это ID редактора TinyMCE, а код после else из принятого ответа не сработал для меня.

23 мар. 2017 г. 08:21:44
Комментарии

Пожалуйста, объясните, чем это отличается от принятого ответа? Какую новую информацию вы предоставляете?

Fayaz Fayaz
23 мар. 2017 г. 09:28:59
0

Мне потребовалось гораздо больше кода, чтобы заставить это работать, также я получал ошибку JavaScript: Deprecated TinyMCE API call: <target>.onKeyUp.add(..). Это было вызвано обновлением WordPress с версии 3.x до 4. Поэтому мне пришлось сначала очистить кеш браузера.

Сначала я добавил callback-функцию к фильтру WP tiny_mce_before_init в файле functions.php, что позволило мне добавить js callback-функцию, которая будет вызываться при инициализации редакторов:

add_filter( 'tiny_mce_before_init', array( $obj, 'filter_cb_mce_before_init' ) );

/**
 * Callback фильтра для добавления обработчиков событий к редактору TinyMCE.
 * @param  array $init Массив строк с js функциями для настройки.
 * @return array       Возвращает новый массив строк с js функциями.
 */
function filter_cb_mce_before_init( array $init ) {
        $init['setup'] = "function(ed){
                if(get_tinymce_content)  //необязательно, я использую это как флаг для проверки правильной страницы
                    ed.on('change', function(){ get_tinymce_content() });
            }";
        return $init;
    }

Далее идет javascript-функция для выполнения любых действий с контентом при его изменении. Добавьте этот javascript с помощью wp_enqueue_scripts на нужную вам страницу.

  /**
   * Получает содержимое редактора TinyMCE.
   * @link http://wordpress.stackexchange.com/questions/42652/how-to-get-the-input-of-a-tinymce-editor-when-using-on-the-front-end
   * @return {string} Возвращает содержимое
   */
  function get_tinymce_content(){

    //замените на имя редактора, указанное в wp_editor()
    var editorID = 'my_editor_id';

    if (jQuery('#wp-'+editorID+'-wrap').hasClass("tmce-active"))
        var content = tinyMCE.get(editorID).getContent({format : 'raw'});
    else
        var content = jQuery('#'+editorID).val();

    console.log(content);
}

Код заработал, когда я использовал следующее для вывода редактора на любую страницу:

<?php wp_editor( @$event->description, 'my_editor_id', array(
    'media_buttons' => false,
    'textarea_name' => 'data[description]',
    'quicktags'     => array("buttons"=>"link,img,close"),
) ); ?>
5 янв. 2015 г. 07:44:19
0

Вы можете получить содержимое в зависимости от текущего режима редактора.

function get_tinymce_content()
    {
    if (jQuery(".switch-tmce").css('background-color')=='rgb(245, 245, 245)')
        return tinyMCE.activeEditor.getContent();
    else
        return jQuery('#html_text_area_id').val();
    }

Вкладка Визуальный имеет класс switch-tmce, который вы можете использовать для её идентификации. Вы узнаете, что она активна, по более светлому цвету фона. Таким образом, вы можете использовать это для определения, какая из двух вкладок активна.

Это адаптивное решение на основе ответа от Bainternet. Вероятно, существуют и другие, более совершенные способы, но этот вариант хорошо сработал у меня.

15 дек. 2015 г. 22:37:00
0

Вы также можете использовать событие addeditor:

  /// Срабатывает, когда редактор добавляется в коллекцию EditorManager.
  tinymce.on('addeditor', function( event ) {
    var editor = event.editor;
    var $textarea = $('#' + editor.id);
    console.log($textarea.val());
  }, true );

Документация по событию 'addeditor' в TinyMCE

15 нояб. 2016 г. 19:16:25