Для мобильных устройств, на которых не работает Ckeditor, устанавливать программно формат ввода Plain Text

Drupal: 

При добавлении новостей на сайт через мобильные устройства часто бывает, что текст вытягивается в одну строку, то есть не работают переносы строк. Это происходит, если выбран формат ввода Full HTML, а у пользователя мобильного устройства не грузится CKeditor. CKeditor, действительно, не на всех устройствах грузится, поэтому проще всего для мобильных выбрать plain text по умолчанию.

Решение: для всех мобильных изначально выбирать формат ввода Plain Text, но оставлять для продвинутых устройств возможность выбора Full HTML.

Реализация: с модулем Mobile Detect можно определить мобильное устройство до загрузки страницы и поменять настройки поля body и других полей типа text_format.

В нашем хуке изменение формата происходит не только для поля body, но для всех полей формата text_format - то есть область ввода текста.
Если вам нужно оптимизировать код, ускорить, то можно оставить изменения только для поля body и других полей с заданными именами: для этого, удалите лишнее и раскомментируйте строки для body: $form['body']['und'][0]['#format'] = 'plain_text';

Поиск всех полей типа text_format предложен пользователем Евгений в виде рекурсивной функции, в ответе на вопрос тут: http://dru.io/question/2477.

Модуль для всех текстовых полей на сайте заменяет формат ввода на plain text, оставляя возможность выбора других форматов, если это разрешено для пользователя.

Следующий модуль состоит из двух файлов и называется plain_text_for_mobile. В модуле присутствует проверка наличия Mobile_Detect библиотеки и её класса, поэтому он защищён и не ломает сайт.

plain_text_for_mobile.info
  1. name = Plain text for mobile
  2. description = Change default text format for mobile device to plain text
  3. core = 7.x
  4. version = "7.x-1.0"
  5.  
  6. dependencies[] = mobile_detect
  7. package = MyModules
plain_text_for_mobile.module
  1. /*changes text input format for all text fields if user view from mobile*/
  2.  
  3. function plain_text_for_mobile_form_alter(&$form, &$form_state, $form_id) {
  4.  
  5. /*check if Mobile Detect library not work and class not exists return*/
  6. if (!class_exists('Mobile_Detect')) return;
  7.  
  8. $detect = mobile_detect_get_object();
  9. $is_mobile = $detect->isMobile();
  10.  
  11. if ($is_mobile) {
  12. /* change default text format*/
  13. plain_text_for_mobile_recursive_form($form);
  14. /*only for body field
  15.   if (isset($form['body'])) $form['body']['und'][0]['#format'] = 'plain_text';
  16.   */
  17. }
  18.  
  19. }
  20.  
  21.  
  22. /* search text_format field and add plain_text*/
  23. function plain_text_for_mobile_recursive_form(&$element) {
  24. if (!is_array($element)) return;
  25. foreach ($element as $key => &$value) {
  26. if (is_array($value) && !empty($value['#type']) && $value['#type'] == 'text_format') {
  27. $value['#format'] = 'plain_text';
  28. }
  29. plain_text_for_mobile_recursive_form($element[$key]);
  30. }
  31. }

Для работы нашего модуля обязательно включите модуль Mobile Detect и правильно настройте библиотеку Mobile_Detect.php. Убедитесь, что в отчётах нет ошибок, и библиотека найдена.

В коде присутствует рекурсивная функция поиска текстовых полей, что может быть не эффективно в плане оптимизации модуля. Так как на сайте может быть много форм на одной странице, а переменная $form имеет довольно большой объём данных, можно отключить поиск всех полей и задавать названия полей в коде, дополнив его новыми строками с названиями необходимых полей. Для оптимизации кода можно оставить только строку для поля body:
if (isset($form['body'])) $form['body']['und'][0]['#format'] = 'plain_text';
и дописать названия других важных текстовых полей, и не вызывать эту рекурсивную функцию plain_text_for_mobile_recursive_form() .

Чтобы узнать имена других текстовых полей на вашем сайте, включите модуль Devel и допишите в код модуля строку dpm($form); - которая выведет информацию о всех полях формы. Также имена полей можно узнать в настройках полей вашего типа материала.

Также для оптимизации можно добавить в начало хука проверку типа формы: node, taxonomy, user, comment, webforms и другие - это остановит работу модуля для форм, например корзины, добавления товара, выбора языка.

Модули: