Double field: подключить CKEditor к текстовой области (textarea)


39

Те, кто использует модуль Double field могли заметить, что в текстовой области отсутствует редактор. Бывают случаи, когда для удобства наполнения он просто необходим.

По умолчанию CKEditor используется только в элементах «Фильтрованный текст» (пользователь выбирает текстовый формат). Для обычных textarea он не работает, т.к. нет дополнительного поля с текстовым форматом. Можно прикрепить CKEditor к виджету Double field вручную с помощью пользовательского PHP/JS сниппета, но мы не сможем контролировать его через профили CKEditor.

Предлагаю интересный вариант решения данной задачи:
Применим hook_field_widget_form_alter. Этот хук позволяет изменять виджеты полей перед выводом на форму. 

function MYMODULE_field_widget_form_alter(&$element, &$form_state, $context) {
//Ищем нужное поле. Условие может меняться в зависимости от Вашей задачи.
//Можно обработать только отдельные поля, выбрав их по именам
//$context['field']['field_name'] == 'field_text_column')
//Можно выбрать все 'double_field'
//В примере ниже я обрабатывал все 'double_field' с виджетом 'textarea_&_textarea'
  if ($context['field']['type'] == 'double_field' && $context['instance']['widget']['type'] == 'textarea_&_textarea') {
//Меняем тип полей с 'textarea' на 'text_format'
//YOUR_FILTER_FORMAT - это название текстового формата, например 'filtered_html'
    $element['first']['#type'] = 'text_format';
    $element['first']['#base_type'] = 'textarea';
    $element['first']['#format'] = YOUR_FILTER_FORMAT;

    $element['second']['#type'] = 'text_format';
    $element['second']['#base_type'] = 'textarea';
    $element['second']['#format'] = YOUR_FILTER_FORMAT;

//И в конце добавим собственную функцию проверки для данного виджета
//но использовать мы ее будем совсем не для проверки, 
//тут важно, что она вызывается до submit всей формы
    $element['#element_validate'] = array('_frz_doublefield_textarea_replace');
  }
}

Функция _frz_doublefield_textarea_replace нужна для того, что бы изменить массив $form_state['values'] до отправки формы. Иначе друпал будет пытаться записать в БД несуществующее поле c форматом и соответственно - ошибка

function _frz_doublefield_textarea_replace($element, &$form_state) {
  $parents = $element['#field_parents'];
  $parents[] = $element['#field_name'];
  $value_old = drupal_array_get_nested_value($form_state['values'], $parents);

  if (is_array($value_old)) {
    foreach ($value_old as $lang => $value) {
      foreach ($value as $key => $val) {
        unset($value_old[$lang][$key]['first']['format']);
        if (isset($val['first']['value'])) {
          $value_old[$lang][$key]['first'] = $val['first']['value'];
        }
        unset($value_old[$lang][$key]['second']['format']);
        if (isset($val['second']['value'])) {
          $value_old[$lang][$key]['second'] = $val['second']['value'];
        }
      }
    }
    drupal_array_set_nested_value($form_state['values'], $parents, $value_old);
  }
}

Update 21.05.2017:
Новый вариант функции _frz_doublefield_textarea_replace - теперь данное решение работает и на вложенных формах. (тестировал случай, когда поле идет в составе Параграфа)

Drupal Drupal 7 — Статьи проCKEditor
Добавить комментарий
Может быть интересно

Данный скрипт поможет пересохранить файлы Excel в csv. Может быть полезно перед отправкой прайсов на хостинг для дальнейшей обработки

5

Иногда необходимо вывести в одном документе не только символы стандартной латиницы и своего национального алфавита. Например, для того, чтобы сослаться на название немецкого, французского или чешского источника, либо привести цитату на греческом языке (кстати, огромное множество символов просто отсутствует на клавиатуре).

1
Иногда при разработке сайта появляется необходимость создавать отдельный шаблон для определенной ноды. По умолчанию такой возможности нет, зато можно это прикрутить самостоятельно. Как это сделать? Это можно узнать в данной статье.

В общем, проблема старая и известная. Правда не на всех рейсурсах заметная. При использовании модуля Metatag, на форму редактирования сущностей добавляется вкладка для индивидуального изменения метатегов. И на ней используется браузер токенов.

1
Данный модуль просто незаменим, если на Вашем сайте реализована мультиязычность или на Вашем сайте используются панели. Multilingual Panels позволяет создавать/менять настройки панели для различных языков.
1