Перейти к содержимому

Визуальный редактор не работает - разбор причин

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

С чего начать

Первая проверка делит причины ровно пополам: либо окно редактора не появилось вовсе, либо оно работает и портит уже сохранённое содержимое.

Смотрим консоль браузера на форме правки:

window.addEventListener('error', (e) => console.log('упал скрипт:', e.filename, e.lineno));
console.log(typeof BX, typeof BX.ready); // undefined означает оборванную загрузку ядра
console.log(document.scripts.length); // счётчик падает, когда объединение отдало битый файл

Ошибка в чужом скрипте страницы обрывает очередь инициализации, и окно редактора просто не успевает нарисоваться. Если ядро на месте и консоль чиста, редактор жив, и разбираем уже содержимое поля.

Сверяем сохранённое значение с введённым:

$res = CIBlockElement::GetList([], ['IBLOCK_ID' => 5, 'ID' => $elementId], false, false,
['ID', 'DETAIL_TEXT', 'DETAIL_TEXT_TYPE']);
$row = $res->Fetch();
var_dump($row['DETAIL_TEXT_TYPE'], mb_substr($row['DETAIL_TEXT'], 0, 300));
// text вместо html означает потерянный тип содержимого, а не чистку разметки

Пропавшие теги видно сразу: значение сохранилось, но разметки в нём заметно меньше, чем вводили. Тип содержимого проверяем той же выборкой, потому что эти две поломки путают между собой чаще всего.

Смотрим тип свойства, если редактора нет:

$res = CIBlockProperty::GetList([], ['IBLOCK_ID' => 5, 'CODE' => 'TEXT_BLOCK']);
while ($prop = $res->Fetch()) {
printf("%s: базовый тип %s, пользовательский %s\n",
$prop['CODE'], $prop['PROPERTY_TYPE'], $prop['USER_TYPE'] ?: 'нет');
}
// S без пользовательского типа - обычная строка, визуального режима у неё не бывает

Смена базового типа на живом свойстве очищает накопленные значения в инфоблоках второй версии. Поэтому нужный тип заводят новым свойством, а старые значения переносят отдельным скриптом.

Смотрим журнал вторжений за момент сохранения:

$rs = CEventLog::GetList(['ID' => 'DESC'],
['=AUDIT_TYPE_ID' => ['SECURITY_FILTER_PHP', 'SECURITY_FILTER_SQL']]);
while ($row = $rs->Fetch()) {
printf("%s %s %s\n", $row['TIMESTAMP_X'], $row['REMOTE_ADDR'], $row['DESCRIPTION']);
}

Запись, совпавшая по времени с нажатием кнопки сохранения, прямо указывает на проактивный фильтр. Если такой записи нет, разметку срезал сам редактор или обработчик проекта на сохранении.

Проверяем права сотрудника и модуль управления структурой:

printf("правка кода: %s\n", $USER->CanDoOperation('edit_php') ? 'есть' : 'нет');
printf("группы: %s\n", implode(',', $USER->GetUserGroupArray()));
printf("модуль структуры: %s\n", \CModule::IncludeModule('fileman') ? 'подключён' : 'нет');

Под администратором любые проверки прав проходят всегда, поэтому симптом воспроизводим под учётной записью настоящего контент-менеджера.

Проверяем стили шаблона, если пропала часть кнопок:

Окно терминала
ls -la /home/bitrix/www/local/templates/main/styles.css
grep -c . /home/bitrix/www/local/templates/main/styles.css
grep -n 'input\|button' /home/bitrix/www/local/templates/main/template_styles.css | head
# пустой или отсутствующий styles.css убирает список стилей из панели редактора
# правила шаблона на input и button перекрывают оформление кнопок самого редактора

Причины

  1. Ошибка клиентского кода обрывает запуск редактора примерно 30% случаев

    ПризнакОкно редактора не рисуется совсем, а в консоли браузера висит ошибка скрипта.

    ПроверкаОткрываем консоль до перехода в форму правки и смотрим первую ошибку вместе с её файлом.

    Что делатьЧиним свой скрипт страницы, а панель кнопок дополнительно проверяем на штатном шаблоне сайта.

  2. Разметку срезает проактивный фильтр при сохранении примерно 25% случаев

    ПризнакИз текста пропадают кадры видео, ссылки на чужие домены и служебные атрибуты тегов.

    ПроверкаИщем в журнале вторжений запись фильтра, совпадающую по времени с сохранением элемента.

    Что делатьЗадаём исключение маской страницы либо выдаём группе редакторов уровень обхода проактивного фильтра.

  3. Редактор выключен настройкой модуля или закрыт правами примерно 18% случаев

    ПризнакВместо редактора показывается обычное поле ввода, либо панель кнопок пришла заметно урезанной.

    ПроверкаСмотрим настройки модуля управления структурой и операцию на правку кода платформы у группы.

    Что делатьВключаем нужную настройку модуля и выдаём операцию только тем, кто понимает последствия правки.

  4. Поле заведено типом без визуального режима примерно 14% случаев

    ПризнакУ соседнего свойства того же инфоблока редактор есть, а у этого значение вводится строкой.

    ПроверкаСверяем тип свойства в настройках инфоблока: строка и пользовательский тип разметки выглядят похоже.

    Что делатьЗаводим новое свойство пользовательским типом разметки: смена базового типа очищает уже накопленные значения.

  5. Вставка из офисного документа приносит чужие стили примерно 8% случаев

    ПризнакПосле вставки текста вёрстка страницы едет, а в коде видны чужие шрифты и служебные теги.

    ПроверкаСравниваем сохранённую разметку с тем, что менеджер видел в окне редактора перед сохранением.

    Что делатьЧистим разметку обработчиком на сохранении: окно очистки форматирования срабатывает далеко не в каждом браузере.

  6. Медиабиблиотека не появляется в форме выбора файла примерно 5% случаев

    ПризнакКнопка вставки изображения открывает только загрузку файла, а коллекций в диалоге нет.

    ПроверкаОткрываем вкладку медиабиблиотеки в настройках модуля управления структурой и читаем состояние опций.

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

Частые вопросы

Почему после правки страницы редактором ломается код в шаблоне?

Редактор оборачивает вызовы платформы в служебный блок и показывает их подписью. Без операции на правку кода такие вставки при сохранении вырезаются целиком.

Визуальный редактор режет html-код: как отключить проверку?

Проверку целиком не отключают, это защита сайта от внедрённого кода. Группе редакторов выдают уровень обхода проактивного фильтра либо задают исключение маской страницы.

Как убрать у свойства визуальный редактор совсем?

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

Не видно кнопок нижнего ряда, куда смотреть?

Чаще всего стили шаблона сайта перекрывают оформление панели редактора. Проверяем форму правки на штатном шаблоне: если кнопки вернулись, ищем виновника в своих стилях.

Редактор перестал очищать форматирование при вставке, что делать?

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

Смежное

Первоисточник