Skip to content

Работа с CKEditor в JavaScript, Drupal

Иногда нужно создать инстанс CKEditor на фронте — например, по нажатию кнопки. Обычно это делается через форму с сервера, но не всегда есть смысл городить отдельный AJAX‑запрос только ради редактора.

Ниже — вариант для Drupal 7 с модулем CKEditor.

1. Инициируем CKEditor на сервере

CKEditor не подключит JS и не передаст нужные настройки, если на сервере ни разу не пытались отрендерить редактор. Поэтому симулируем форму с полем text_format и даём Drupal'у возможность прогнать соответствующие хуки.

php
<?php
/**
 * Form builder for editor.
 */
function mymodule_editor_form($form, &$form_state) {
  $form['editor'] = [
    '#type' => 'text_format',
  ];

  return $form;
}

function mymodule_page_callback() {
  $form = drupal_get_form('mymodule_editor_form');

  // Сделаем вид, что собираемся показать форму с редактором:
  drupal_render($form);

  // ...
}

mymodule_page_callback() — это page callback вашей страницы. Вызов drupal_render() заставляет модуль CKEditor подготовить все скрипты и настройки для клиента.

2. Создаём textarea и включаем CKEditor на фронте

На странице достаточно любой textarea с уникальным id:

html
<textarea id="any-unique-id"></textarea>

Дальше важно знать, какой текстовый формат вы хотите использовать (например, filtered_html).

Простейшая инициализация:

js
// Где-то после того, как Drupal.settings уже заполнен CKEditor'ом.
Drupal.settings.ckeditor.elements['any-unique-id'] = 'filtered_html';
Drupal.ckeditorInit('any-unique-id');

Не забывайте использовать Друпальные js-behavior'ы.

Полезные функции CKEditor в Drupal

js
// Инстанс редактора:
var editor = CKEDITOR.instances['any-unique-id'];

// Получить текст:
editor.getData();

// Установить текст:
editor.setData('any text');

// Подписаться на изменения:
editor.on('change', function () {
  console.log(editor.getData());
});

// Разрушить редактор и вернуть textarea назад:
editor.destroy();