Визуальный редактор не работает - разбор причин
Визуальный редактор не открывается в форме правки, теряет часть разметки при сохранении или отдаёт на витрину совсем не тот текст, который вводил менеджер. Разбираем причины по убыванию частоты.
С чего начать
Первая проверка делит причины ровно пополам: либо окно редактора не появилось вовсе, либо оно работает и портит уже сохранённое содержимое.
Смотрим консоль браузера на форме правки:
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.cssgrep -c . /home/bitrix/www/local/templates/main/styles.cssgrep -n 'input\|button' /home/bitrix/www/local/templates/main/template_styles.css | head# пустой или отсутствующий styles.css убирает список стилей из панели редактора# правила шаблона на input и button перекрывают оформление кнопок самого редактораПричины
-
Ошибка клиентского кода обрывает запуск редактора примерно 30% случаев
ПризнакОкно редактора не рисуется совсем, а в консоли браузера висит ошибка скрипта.
ПроверкаОткрываем консоль до перехода в форму правки и смотрим первую ошибку вместе с её файлом.
Что делатьЧиним свой скрипт страницы, а панель кнопок дополнительно проверяем на штатном шаблоне сайта.
-
Разметку срезает проактивный фильтр при сохранении примерно 25% случаев
ПризнакИз текста пропадают кадры видео, ссылки на чужие домены и служебные атрибуты тегов.
ПроверкаИщем в журнале вторжений запись фильтра, совпадающую по времени с сохранением элемента.
Что делатьЗадаём исключение маской страницы либо выдаём группе редакторов уровень обхода проактивного фильтра.
-
Редактор выключен настройкой модуля или закрыт правами примерно 18% случаев
ПризнакВместо редактора показывается обычное поле ввода, либо панель кнопок пришла заметно урезанной.
ПроверкаСмотрим настройки модуля управления структурой и операцию на правку кода платформы у группы.
Что делатьВключаем нужную настройку модуля и выдаём операцию только тем, кто понимает последствия правки.
-
Поле заведено типом без визуального режима примерно 14% случаев
ПризнакУ соседнего свойства того же инфоблока редактор есть, а у этого значение вводится строкой.
ПроверкаСверяем тип свойства в настройках инфоблока: строка и пользовательский тип разметки выглядят похоже.
Что делатьЗаводим новое свойство пользовательским типом разметки: смена базового типа очищает уже накопленные значения.
-
Вставка из офисного документа приносит чужие стили примерно 8% случаев
ПризнакПосле вставки текста вёрстка страницы едет, а в коде видны чужие шрифты и служебные теги.
ПроверкаСравниваем сохранённую разметку с тем, что менеджер видел в окне редактора перед сохранением.
Что делатьЧистим разметку обработчиком на сохранении: окно очистки форматирования срабатывает далеко не в каждом браузере.
-
Медиабиблиотека не появляется в форме выбора файла примерно 5% случаев
ПризнакКнопка вставки изображения открывает только загрузку файла, а коллекций в диалоге нет.
ПроверкаОткрываем вкладку медиабиблиотеки в настройках модуля управления структурой и читаем состояние опций.
Что делатьВключаем использование медиабиблиотеки, а для всех системных форм выбора файла - ещё и применение по умолчанию.
Частые вопросы
Почему после правки страницы редактором ломается код в шаблоне?
Редактор оборачивает вызовы платформы в служебный блок и показывает их подписью. Без операции на правку кода такие вставки при сохранении вырезаются целиком.
Визуальный редактор режет html-код: как отключить проверку?
Проверку целиком не отключают, это защита сайта от внедрённого кода. Группе редакторов выдают уровень обхода проактивного фильтра либо задают исключение маской страницы.
Как убрать у свойства визуальный редактор совсем?
Завести свойство обычной строкой и задать ей нужную высоту поля. Тогда у менеджера не будет ни визуального режима, ни режима правки разметки.
Не видно кнопок нижнего ряда, куда смотреть?
Чаще всего стили шаблона сайта перекрывают оформление панели редактора. Проверяем форму правки на штатном шаблоне: если кнопки вернулись, ищем виновника в своих стилях.
Редактор перестал очищать форматирование при вставке, что делать?
Окно очистки зависит от браузера и после обновлений платформы появляется не всегда. Надёжнее чистить разметку своим обработчиком на сохранении, а не рассчитывать на диалог.
Смежное
- Страницы в админке - оглавление подтемы
- Визуальный редактор: панель, сниппеты, чистка вставленного кода - как настроить редактор правильно
- Страница админки не открывается: разбор причин - когда не открывается вся страница целиком
- Cannot read properties of undefined: разбор причин на витрине - соседний разбор клиентских ошибок
- Проактивный фильтр: уровни защиты, исключения, ложные срабатывания - откуда берётся чистка разметки
- Дата, число и HTML в свойствах: хранение, вывод, фильтр - как хранится текст с разметкой
- Форма в админке: вкладки, проверка значений, тулбар - куда встраивают редактор
- Роли менеджеров: что видит и что может в админке - права на правку кода платформы
- Административный интерфейс - устройство интерфейса целиком