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

Свой компонент не подключается - разбор причин

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

С чего начать

Проверяем, что платформа видит файлы компонента:

Окно терминала
ls -la /home/bitrix/www/local/components/vendor/catalog.promo/
# ожидаем component.php, а при своём классе - ещё и class.php с .parameters.php

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

Смотрим ошибки самого компонента:

// временно на странице с вызовом, до подключения компонента
ini_set('display_errors', '1');
error_reporting(E_ALL);
// ошибка внутри класса компонента иначе превращается в пустое место на странице

Проверяем, какой шаблон ищется:

$APPLICATION->IncludeComponent('vendor:catalog.promo', 'main', []);
// шаблон 'main' обязан лежать в templates/main компонента или шаблона сайта
echo $this->__template->GetFolder(); // путь подключённого шаблона при отладке

Шаблон ищется сначала в шаблоне сайта, потом в самом компоненте. Отсутствие шаблона с нужным именем даёт пустой вывод при полностью рабочем коде компонента, и это самая обидная причина.

Отключаем кэш на время проверки:

$APPLICATION->IncludeComponent('vendor:catalog.promo', 'main', [
'CACHE_TYPE' => 'N', // на время разбора, чтобы видеть свежий результат
]);

Смотрим, что доехало до кода компонента:

// component.php своего компонента
\Bitrix\Main\Diag\Debug::writeToFile($arParams, 'параметры', 'component.log');
\Bitrix\Main\Diag\Debug::writeToFile($this->getName(), 'имя', 'component.log');
// параметры проходят через подготовку и могут измениться до основного кода

Причины

  1. Файлы лежат не в том каталоге примерно 30% случаев

    ПризнакСтраница открывается, а на месте компонента пусто и без единой ошибки.

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

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

  2. Ошибка внутри кода компонента примерно 25% случаев

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

    ПроверкаВключаем вывод ошибок на стенде и смотрим журнал ошибок веб-сервера.

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

  3. Не найден шаблон компонента примерно 20% случаев

    ПризнакКод компонента отрабатывает, данные собираются, а разметки на странице нет.

    ПроверкаПроверяем наличие каталога шаблона с нужным именем в компоненте и в шаблоне сайта.

    Что делатьСоздаём шаблон с тем именем, которое передано вторым аргументом вызова компонента.

  4. Отдаётся старый результат из кэша примерно 15% случаев

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

    ПроверкаОтключаем кэш параметром вызова и сравниваем результат с прежним.

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

  5. Параметры не доехали до кода примерно 10% случаев

    ПризнакКомпонент работает, но ведёт себя так, будто параметры вызова пустые.

    ПроверкаПечатаем массив параметров в журнал в самом начале кода компонента.

    Что делатьПравим подготовку параметров: значения по умолчанию там легко затирают переданные.

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

Где должен лежать свой компонент?

В каталоге компонентов своего пространства имён, а не среди штатных. Так обновление продукта не тронет ваш код и не удалит его при переустановке модуля.

Почему компонента нет в визуальном редакторе?

Ему нужен файл описания с указанием места в дереве компонентов. Без описания компонент работает из кода, но в редакторе не появляется.

Как понять, какой шаблон подключился?

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

Нужен ли компоненту класс?

Не обязателен: простой компонент живёт одним файлом. Класс нужен для действий, наследования и аккуратной подготовки параметров.

Почему пустой вывод бывает без ошибок?

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

Смежное

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