Использование CKEditor в любых формах

Задача привязки CKEditor в Drupal 7 к текстовому полю любой формы решается довольно таки легко. Дело в том, что CKEditor инициализируется на элементах форм, которые имеют тип 'text_format'. Соответственно достаточно просто заменить существующий тип текстового поля textfield или textarea на text_format. При необходимости можно в свойстве поля #format указать машинное имя текстового формата.

Для примера рассмотрим создание простейшей формы:


function simple_form($form, &$form_state) {
  // ...
  
  $form['body'] = array(
    // Задаем полю body тип text_format
    '#type' => 'text_format',
    '#title' => t('Body'),
    // Для устранения проблем подключения CKeditor в модальных формах добавляем pre render
    $form['message']['#pre_render'] = array('ckeditor_pre_render_text_format');
  );

  global $user;
  // Для роли moderator задаем формат Full HTML
  if (in_array('moderator', $user->roles) && user_access('use text format full_html')) {
    $form['body']['#format']  = 'full_html';
  }

  $form['actions'] = array('#type' => 'actions');
  $form['actions']['submit'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit'),
  );
}

Далее при обработке результатов отправки формы нужно будет учесть, что элемент text_format состоит из двух элементов: value - содержит html код, сформированный CKeditor, и format - содержит машинное имя текстового формата. Соответственно в $form_state['values'] для этого элемента будет передаваться массив из двух элементов. И для получения отформатированного значения нужно будет переданное значение пропустить через функцию check_markup().


function simple_form_submit($form, &$form_state) {
  // ...
  // HTML код сформированный CKeditor
  $value = $form_state['values']['body']['value'];
  //  Имя формата
  $format = $form_state['values']['body']['format'];
  // Пропускаем код через все фильтры формата 
  $markup = check_markup($value, $format);
  // ...
}