Те, кто использует модуль 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 - теперь данное решение работает и на вложенных формах. (тестировал случай, когда поле идет в составе Параграфа)
- 19.05.2017
- 91 просмотр