Можно ли добавить пользовательский формат в панель форматирования текста?

10 нояб. 2010 г., 16:42:59
Просмотры: 20.6K
Голосов: 18

В текстовом редакторе, где можно установить заголовки и другие настройки, возможно ли добавить собственные стили для использования клиентами? А также удалить ненужные?

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

WP3 и TinyMCE просто ужасны в этом плане. Не могу поверить, что так сложно добавить или настроить форматы, как это сделано в CKEditor.

cherouvim cherouvim
10 дек. 2010 г. 22:43:09

Согласен, это полный кошмар.

Mild Fuzz Mild Fuzz
11 дек. 2010 г. 20:36:36
Все ответы на вопрос 3
13
20

В "классическом" редакторе TinyMCE есть два выпадающих списка: formatselect для стилей абзацев и styleselect для стилей символов — которые также могут содержать стили абзацев, что может вызвать путаницу. По умолчанию в WordPress отображается только выпадающий список формата. Если применить пользовательскую таблицу стилей к редактору, TinyMCE может использовать её для извлечения классов и добавления их в выпадающий список стилей — но у меня это срабатывало не всегда.

Начиная с версии 3.0, вы можете вызвать add_editor_style() в вашем functions.php, чтобы добавить таблицу стилей в редактор. По умолчанию используется файл editor-style.css в директории вашей темы. До версии 3.0 необходимо было использовать фильтр mce_css, чтобы добавить URL вашей таблицы стилей редактора. В итоге это попадает в значение конфигурации TinyMCE content_css.

Чтобы добавить выпадающий список стилей, опция styleselect должна быть указана в одном из массивов конфигурации панели кнопок (theme_advanced_buttons[1-4] в TinyMCE, фильтруемый через mce_buttons_[1-4] в WordPress). Список форматов блоков управляется опцией TinyMCE theme_advanced_blockformats, которую можно добавить в массив управления через фильтр tiny_mce_before_init. Если вы хотите настроить названия в выпадающем списке стилей (а не только имена CSS-классов), обратите внимание на опцию theme_advanced_styles. Также можно использовать более продвинутую опцию style_formats, которая предоставляет больше гибкости в определении стилей.

Соответствующий PHP-код со всеми хуками и конфигурацией по умолчанию находится в wp-admin/includes/post.php, в функции wp_tiny_mce(). В целом, ваша настройка может выглядеть так:

add_action( 'after_setup_theme', 'wpse3882_after_setup_theme' );
function wpse3882_after_setup_theme()
{
    add_editor_style();
}

add_filter('mce_buttons_2', 'wpse3882_mce_buttons_2');
function wpse3882_mce_buttons_2($buttons)
{
    array_unshift($buttons, 'styleselect');
    return $buttons;
}

add_filter('tiny_mce_before_init', 'wpse3882_tiny_mce_before_init');
function wpse3882_tiny_mce_before_init($settings)
{
    $settings['theme_advanced_blockformats'] = 'p,h1,h2,h3,h4';

    // Взято с http://tinymce.moxiecode.com/examples/example_24.php
    $style_formats = array(
        array('title' => 'Жирный текст', 'inline' => 'b'),
        array('title' => 'Красный текст', 'inline' => 'span', 'styles' => array('color' => '#ff0000')),
        array('title' => 'Красный заголовок', 'block' => 'h1', 'styles' => array('color' => '#ff0000')),
        array('title' => 'Пример 1', 'inline' => 'span', 'classes' => 'example1'),
        array('title' => 'Пример 2', 'inline' => 'span', 'classes' => 'example2'),
        array('title' => 'Стили таблицы'),
        array('title' => 'Строка таблицы 1', 'selector' => 'tr', 'classes' => 'tablerow1'),
    );
    // До версии 3.1 требовался специальный трюк для передачи этого массива в конфигурацию.
    // Смотрите историю изменений этого поста для предыдущих версий.
    $settings['style_formats'] = json_encode( $style_formats );

    return $settings;
}
10 нояб. 2010 г. 16:59:18
Комментарии

Есть ли специальный формат, который должен иметь .css при использовании add_editor_style? Кажется, ничего не происходит.

Mild Fuzz Mild Fuzz
10 нояб. 2010 г. 17:25:31

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

Mild Fuzz Mild Fuzz
11 нояб. 2010 г. 14:52:07

@Mild Fuzz: Мой предыдущий ответ был вводящим в заблуждение, потому что WordPress показывает только один из двух необходимых выпадающих списков. Я обновил свой ответ, добавив способ добавления второго списка и управления им.

Jan Fabry Jan Fabry
11 нояб. 2010 г. 15:39:58

ты просто легенда!! не совсем понимаю, что делает 'style_formats', но 'theme_advanced_styles' делает именно то, что мне нужно!!

Mild Fuzz Mild Fuzz
11 нояб. 2010 г. 15:47:15

очень хочу, чтобы второй блок начал работать, так как выглядит, что он может быть чрезвычайно полезным. Проблема в том, что $settings['style_formats'] изначально равен null, поэтому я не могу сравнить форматы с чем-либо.

Mild Fuzz Mild Fuzz
11 нояб. 2010 г. 16:35:46

@Mild Fuzz: Параметры для различных элементов style_formats объясняются на связанной formats wiki странице.

Jan Fabry Jan Fabry
11 нояб. 2010 г. 16:46:02

всё показано на JS, немного запутался, как преобразовать это в рабочий PHP. Пробовал '$settings['style_formats'] .= "custom_format : {block : 'h1', attributes : {title : \"Header\"}, styles : {color : red}}";', но это полностью убивает tinyMCE

Mild Fuzz Mild Fuzz
11 нояб. 2010 г. 16:55:01

@Mild Fuzz: Я думал, WordPress применит json_encode() к конфигурации, но он просто выводит её. Я изменил свой ответ, включив туда "JS-инъекцию" для передачи массива конфигурации в TinyMCE. Не гарантируется, что сработает.

Jan Fabry Jan Fabry
11 нояб. 2010 г. 17:32:31

больше не выдаёт ошибок, но и не работает!

Mild Fuzz Mild Fuzz
12 нояб. 2010 г. 12:23:11

Работает ли пример кода, и решил ли он ваш вопрос? Обратите внимание, что у вас опечатка в конце строки "Table styles" — нужна ), а не }

cherouvim cherouvim
10 дек. 2010 г. 22:41:57

json_encode генерирует ", а не ', поэтому JavaScript ломается. Вам нужно сделать str_replace('"', "'", json_encode($style_formats))

cherouvim cherouvim
10 дек. 2010 г. 23:00:01

Как переименовать выпадающую кнопку из Formats?

ejntaylor ejntaylor
17 авг. 2016 г. 16:18:03

@raison: Лучше задать этот вопрос отдельно.

Jan Fabry Jan Fabry
17 авг. 2016 г. 16:25:57
Показать остальные 8 комментариев
0

Вы можете добавить собственный формат или удалить существующий следующим образом:

add_filter('tiny_mce_before_init', function($init_array) {
    $init_array['formats'] = json_encode([
        // добавляем новый формат
        'h3marked' => [
            'selector' => 'h3',
            'block'    => 'h3',
            'classes'  => 'article-paragraph',
        ],
    ], JSON_THROW_ON_ERROR);

    // удаляем ненужные форматы из массива
    $block_formats = [
        'Абзац=p',
        'Заголовок 1=h1',
        'Заголовок 2=h2',
        'Заголовок 3=h3',
        'Заголовок 3 с маркером=h3marked',    // используем новый формат в выборе
        'Заголовок 4=h4',
        'Заголовок 5=h5',
        'Заголовок 6=h6',
        'Преформатированный=pre',
    ];
    $init_array['block_formats'] = implode(';', $block_formats);

    return $init_array;
});

Подробнее смотрите в этой статье и документации TinyMCE

1 апр. 2021 г. 13:35:18
1

Как указано здесь Выпадающий список форматов TinyMCE больше не показывает предпросмотр стилей

Кара была права, необходимо сбросить стили по умолчанию, чтобы увидеть новые стили...

unset($init['preview_styles']);

return $settings;
25 февр. 2016 г. 23:36:54
Комментарии

Пожалуйста, добавьте больше деталей. Например, неясно, что такое $settings в данном контексте. Спасибо.

birgire birgire
25 февр. 2016 г. 23:50:43