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


140

Те, кто использует модуль 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
Добавить комментарий
Может быть интересно

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

1

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

6
1
В статье представлены несколько способов запуска переиндексации отдельных элементов индекса (можно применять в зависимости от поставленной задачи и исходных данных). В них рассматривается переиндексация элементов во всех индексах, которые включены на сайте. Если нужна переиндексация только в определенном, можно убрать ту часть, где идет загрузка индексов и использовать какой-то определенный объект индекса.
1
По умолчанию в drupal commerce через правила Вы можете работать с полем цена у сущности commerce_product. А вот если Вам необходимо достучаться до поля цена у заказа, то тут будут проблемы. Покажу, как научить правила работать с ценой у заказа.
2
По умолчанию при выводе поля с типом text_format Друпал отображает справочную информацию об ограничения того или иного текстового формата. Но не всегда данная информация нужна для конечного пользователя. Приведу способ, которым можно скрыть её вывод. Вариант через css мы не рассматриваем.
1