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