Свой компонент не подключается - разбор причин
Вызов компонента на странице есть, а на витрине пусто или ошибка. Разбираем причины по убыванию частоты, начиная с расположения файлов.
С чего начать
Проверяем, что платформа видит файлы компонента:
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');// параметры проходят через подготовку и могут измениться до основного кодаПричины
-
Файлы лежат не в том каталоге примерно 30% случаев
ПризнакСтраница открывается, а на месте компонента пусто и без единой ошибки.
ПроверкаСмотрим каталог компонента и сверяем его имя с именем в вызове на странице.
Что делатьКладём компонент в свой каталог компонентов и приводим имя вызова к каталогу.
-
Ошибка внутри кода компонента примерно 25% случаев
ПризнакКомпонент найден, но страница обрывается или показывает пустое место.
ПроверкаВключаем вывод ошибок на стенде и смотрим журнал ошибок веб-сервера.
Что делатьЧиним ошибку в коде компонента: молчаливый обрыв почти всегда именно она.
-
Не найден шаблон компонента примерно 20% случаев
ПризнакКод компонента отрабатывает, данные собираются, а разметки на странице нет.
ПроверкаПроверяем наличие каталога шаблона с нужным именем в компоненте и в шаблоне сайта.
Что делатьСоздаём шаблон с тем именем, которое передано вторым аргументом вызова компонента.
-
Отдаётся старый результат из кэша примерно 15% случаев
ПризнакПравки кода не видны, а после сброса кэша появляются сразу и целиком.
ПроверкаОтключаем кэш параметром вызова и сравниваем результат с прежним.
Что делатьСбрасываем кэш компонента после правок и следим за составом ключа кэширования.
-
Параметры не доехали до кода примерно 10% случаев
ПризнакКомпонент работает, но ведёт себя так, будто параметры вызова пустые.
ПроверкаПечатаем массив параметров в журнал в самом начале кода компонента.
Что делатьПравим подготовку параметров: значения по умолчанию там легко затирают переданные.
Частые вопросы
Где должен лежать свой компонент?
В каталоге компонентов своего пространства имён, а не среди штатных. Так обновление продукта не тронет ваш код и не удалит его при переустановке модуля.
Почему компонента нет в визуальном редакторе?
Ему нужен файл описания с указанием места в дереве компонентов. Без описания компонент работает из кода, но в редакторе не появляется.
Как понять, какой шаблон подключился?
Вывести путь к шаблону прямо в разметке при отладке. Так сразу видно, взят шаблон из компонента или переопределённый из шаблона сайта.
Нужен ли компоненту класс?
Не обязателен: простой компонент живёт одним файлом. Класс нужен для действий, наследования и аккуратной подготовки параметров.
Почему пустой вывод бывает без ошибок?
Отключён показ ошибок, а компонент прерывается на исключении. На стенде показ включают, на боевом смотрят журнал ошибок.
Смежное
- Компонент изнутри: вызов, кэш, шаблон, эпилог - порядок поиска компонента и шаблона
- Свой компонент - оглавление подтемы
- Свой компонент: структура, параметры, кэш результата - как компонент устроен правильно
- AJAX-действия своего компонента: действия, параметры, ошибки - если не работает действие, а не вывод
- Наследование компонента: свой класс поверх чужого - когда свой класс поверх штатного
- Правки шаблона компонента не видны: разбор причин - соседний разбор про кэш и копии
- Компонент не отдаёт нужных данных: причины по убыванию частоты - тот же разбор для штатных компонентов
- Компоненты и шаблоны - устройство компонентов целиком