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

Не удалось обнаружить код вызова компонента - разбор причин

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

С чего начать

Смотрим, как оформлен сам вызов на странице:

<?/**/?>
<?$APPLICATION->IncludeComponent('bitrix:news.list', 'main', [
'IBLOCK_ID' => 5,
]);?>
<!-- вызов живёт в отдельных тегах, а разделитель перед ним помогает редактору -->

Редактор ищет вызов разбором файла, а не выполнением кода. Вызов, слепленный с соседним кодом в одних тегах, он находит не всегда, и настройки компонента перестают открываться прямо из страницы.

Проверяем кодировку файла страницы:

Окно терминала
file -I /home/bitrix/www/news/index.php # ожидаем charset=utf-8
iconv -f utf-8 -t utf-8 /home/bitrix/www/news/index.php > /dev/null || echo 'битые символы'
# файл в другой кодировке редактор разбирает неверно и вызова не видит

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

Ищем повторяющиеся вызовы одного компонента:

Окно терминала
grep -c "IncludeComponent('bitrix:news.list'" /home/bitrix/www/news/index.php
# несколько одинаковых вызовов подряд редактор различает плохо

Проверяем права на файл страницы:

Окно терминала
ls -l /home/bitrix/www/news/index.php
sudo chown bitrix:bitrix /home/bitrix/www/news/index.php # владелец - пользователь сайта
# без права на запись параметры некуда сохранять, и редактор отказывается их открывать

Ищем невалидную разметку рядом с вызовом:

Окно терминала
grep -n '<!--\|-->' /home/bitrix/www/news/index.php | head
# незакрытый комментарий съедает часть файла при разборе страницы редактором

Причины

  1. Вызов оформлен не отдельными тегами примерно 30% случаев

    ПризнакВызов компонента стоит внутри общего блока кода вместе с другими строками.

    ПроверкаОткрываем файл страницы и смотрим, отделён ли вызов собственными тегами языка.

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

  2. Кодировка файла не совпадает с кодировкой сайта примерно 20% случаев

    ПризнакСтраница на витрине выглядит нормально, а в редакторе параметры не открываются.

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

    Что делатьПересохраняем файл в кодировке сайта и проверяем настройки своего редактора кода.

  3. Нет прав на запись в файл страницы примерно 20% случаев

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

    ПроверкаСмотрим владельца и права файла и сравниваем их с пользователем веб-сервера.

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

  4. На странице невалидная разметка примерно 15% случаев

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

    ПроверкаИщем незакрытые комментарии и теги рядом с вызовом компонента в файле страницы.

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

  5. Несколько одинаковых вызовов подряд примерно 15% случаев

    ПризнакНастройки открываются не у того компонента или не открываются у второго вызова.

    ПроверкаСчитаем число одинаковых вызовов компонента в файле одной командой поиска.

    Что делатьРазносим вызовы по включаемым областям или задаём им разные шаблоны и параметры.

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

Можно ли править параметры прямо в файле?

Да, и для разработчика это быстрее визуального редактора. Ошибка редактора при этом остаётся, и её всё равно чинят: параметры правит и контент-менеджер.

Почему ошибка появилась после выкладки?

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

Мешает ли эта ошибка работе сайта?

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

Что за служебный разделитель перед вызовом?

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

Как избежать проблемы на новых страницах?

Держать вызовы компонентов отдельными блоками и не смешивать их с вёрсткой. Сложные страницы собирают из включаемых областей, а не из одного длинного файла.

Смежное

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