Определение детальной страницы товара в 1С-Битрикс без использования компонентов

В разработке на 1С-Битрикс часто возникает необходимость кастомизировать вывод контента в зависимости от типа страницы. В этой статье разберем два рабочих метода определения детальной страницы товара без использования стандартных компонентов.

Определение детальной страницы товара

Зачем это нужно?

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

  1. Управлять SEO-тегами (title, description)
  2. Кастомизировать хлебные крошки
  3. Реализовывать сложную логику шаблонов
  4. Оптимизировать производительность

Рассмотрим два подхода для разных сценариев.


Метод 1: Парсинг URL вручную (для кастомных решений)

Актуально для разделов с #SECTION_CODE_PATH#.

<?php
// В файле result_modifier.php или в начале шаблона
$catalogPath = trim($arParams["SEF_FOLDER"], "/");
$currentPage = $APPLICATION->GetCurPage();

// Удаляем базовый путь из текущего URL
$normalizedPath = preg_replace("#^/{$catalogPath}/#i", "/", $currentPage);
$currentPath = trim($normalizedPath, "/");

// Разбиваем на сегменты
$segments = explode("/", $currentPath);
$segments = array_filter($segments);

$arVariables = [];
$page = "list";

if (!empty($segments)) {
    if (count($segments) == 1) {
        $page = "section";
        $arVariables["SECTION_CODE_PATH"] = $segments[0];
    } else {
        $possibleElementCode = array_pop($segments);
        $arVariables["ELEMENT_CODE"] = $possibleElementCode;
        $arVariables["SECTION_CODE_PATH"] = implode("/", $segments);
        $page = "detail";
    }
}

// Проверка существования элемента
if ($page === "detail") {
    $res = CIBlockElement::GetList(
        [],
        [
            "IBLOCK_ID" => $arParams["IBLOCK_ID"],
            "CODE" => $arVariables["ELEMENT_CODE"],
            "ACTIVE" => "Y"
        ],
        false,
        false,
        ["ID"]
    );

    if (!$res->Fetch()) {
        $page = "section";
        $arVariables["SECTION_CODE_PATH"] = implode("/", array_merge(
            $segments,
            [$arVariables["ELEMENT_CODE"]]
        ));
        unset($arVariables["ELEMENT_CODE"]);
    }
}
?>

Особенности реализации:

  1. Нормализация URL с помощью регулярного выражения
  2. Двойная проверка для вложенных разделов
  3. Обязательная проверка существования элемента
  4. Работа с SECTION_CODE_PATH для многоуровневых разделов

Метод 2: Использование CComponentEngine (стандартный подход)

Для проектов с классической структурой URL (#SECTION_CODE#):

<?php
// В файле component.php или в настройках компонента
$arUrlTemplates = [
    "list" => "",
    "section" => "#SECTION_CODE#/",
    "detail" => "#SECTION_CODE#/#ELEMENT_CODE#/"
];

$arVariables = [];
$page = CComponentEngine::ParseComponentPath(
    $arParams["SEF_FOLDER"],
    $arUrlTemplates,
    $arVariables
);

if (!$page) {
    $page = "list";
}

// Дополнительная проверка для детальной страницы
if ($page === "detail") {
    $res = CIBlockElement::GetList(
        [],
        [
            "IBLOCK_ID" => $arParams["IBLOCK_ID"],
            "CODE" => $arVariables["ELEMENT_CODE"]
        ],
        false,
        false,
        ["ID"]
    );

    if (!$res->Fetch()) {
        LocalRedirect($arParams["SEF_FOLDER"] . $arVariables["SECTION_CODE"] . "/", true);
    }
}
?>

Ключевые моменты:

  1. Использование стандартного механизма Битрикс
  2. Автоматическая валидация параметров
  3. Простая интеграция с существующими компонентами

Интеграция с шаблоном сайта

Пример управления выводом в header.php решения Аспро Лайтшоп:

<!--title_content-->
<?php if ($page !== 'detail'): ?>
    <?php TSolution::ShowPageType('page_title');?>
<?php endif; ?>
<!--end-title_content-->

Дополнительные обработчики:

<?php if ($page === 'detail'): ?>
    <script type="application/ld+json">
    {
        "@context": "https://schema.org",
        "@type": "BreadcrumbList",
        "itemListElement": [
            <?php foreach($arResult['BREADCRUMBS'] as $i => $crumb): ?>
            {
                "@type": "ListItem",
                "position": <?=($i+1)?>,
                "name": "<?=$crumb['TITLE']?>",
                "item": "<?=$crumb['LINK']?>"
            }<?=($i < count($arResult['BREADCRUMBS'])-1 ? ',' : '')?>
            <?php endforeach; ?>
        ]
    }
    </script>
<?php endif; ?>

Типовые ошибки и их решение

  1. Некорректное определение разделов:
    • Всегда проверяйте наличие элемента через CIBlockElement
    • Используйте array_filter для очистки пустых сегментов
  2. Проблемы с ЧПУ:
    // Неправильно:
    $currentPath = str_replace("/catalog/", "", $currentPage);
    
    // Правильно:
    $currentPath = preg_replace("#^/catalog/#i", "", $currentPage);
  3. Кэширование переменных:
    • Используйте тегированный кэш
    • Добавляйте $arVariables в параметры кэширования

Заключение

Оба метода имеют свои преимущества:

  • Первый подход дает полный контроль над структурой URL
  • Второй способ идеален для стандартных проектов

Для сложных каталогов рекомендуем первый метод, для типовых решений – второй. Все примеры кода проверены на версиях Битрикс 22.500+ и PHP 7.4+.


Теги:  детальная страница товара, кастомизация, SEO, хлебные крошки, шаблоны, производительность

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Разработка интернет-магазина с готовой версткой

от 4 недель

от 90 000 рублей

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Разработка корпоративного сайта

от 7 дней

от 40 000 рублей

Разработка сайта без системы оплаты заказов через корзину

* стоимость зависит от наличия верстки, использования готового решения и т.д.