У компонента news.detail есть массив $arResult, в котором уже лежит IBLOCK_SECTION_ID текущего элемента. Осталось получить по нему название и символьный код раздела.
В result_modifier.php шаблона
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
/** @var array $arResult */
$sectionId = (int)$arResult["IBLOCK_SECTION_ID"];
if ($sectionId > 0) {
$rsSection = CIBlockSection::GetList(
[],
["ID" => $sectionId],
false,
["ID", "NAME", "CODE", "IBLOCK_SECTION_ID"]
);
if ($section = $rsSection->GetNext()) {
$arResult["SECTION_NAME"] = $section["NAME"];
$arResult["SECTION_CODE"] = $section["CODE"];
// Собираем URL раздела
$arResult["SECTION_URL"] = !empty($section["CODE"])
? $arResult["SECTION_URL"] // если уже есть в компоненте
: "/content/?SECTION_ID=" . $sectionId; // fallback
}
}
В template.php шаблона
<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die(); ?>
<?php if ($arResult["SECTION_NAME"]): ?>
Раздел: <a href="<?= $arResult["SECTION_URL"] ?>"><?= $arResult["SECTION_NAME"] ?></a>
<?php endif; ?>
<h1><?= $arResult["NAME"] ?></h1>
Вариант покороче — прямо в template.php
Поскольку запрос всего один (не N+1), можно и в шаблоне, но в result_modifier.php аккуратнее:
<?php
$res = CIBlockSection::GetByID($arResult["IBLOCK_SECTION_ID"]);
if ($ar_res = $res->GetNext()):
?>
Раздел: <a href="/content/<?= $ar_res["CODE"] ?>/"><?= $ar_res["NAME"] ?></a>
<?php endif ?>
Важно
- Если используете ЧПУ (CODE в адресе) — ссылка собирается через
CODE - Если без ЧПУ — подставляйте
IDраздела - Для детальной страницы N+1 не проблема (элемент один), но подготовка данных в result_modifier.php — правильная практика: шаблон остаётся тупым, логика в одном месте