Потребовался метод, который возвращает навигационную цепочки в форме архива. Такой метод может потребоваться, например, для того, чтобы в поиске показывать не только найденный документ, но и путь к нему.
В 1С-Битрикс есть метод CMain::GetNavChain, через который можно получить навигационную цепочку в формате html. Но мы можем написать свой метод, который расширяет стандартное поведение CMain::GetNavChain.
Это будет выглядеть так:
class CMainExt extends CMain
{
public function GetNavChain($path=false, $iNumFrom=0, $sNavChainPath=false, $bIncludeOnce=false, $bShowIcons = true)
{
CMain::InitPathVars($site, $path);
$DOC_ROOT = CSite::GetSiteDocRoot($site);
if ($path === false)
{
$path = $this->GetCurDir();
}
$io = CBXVirtualIo::GetInstance();
while (true)
{
$path = rtrim($path, "/");
$chain_file_name = $DOC_ROOT . $path . "/.section.php";
if ($io->FileExists($chain_file_name))
{
$sChainTemplate = "";
$sSectionName = "";
include($io->GetPhysicalName($chain_file_name));
if ($sSectionName <> '')
{
$arChain[] = array("TITLE" => $sSectionName, "LINK" => $path . "/");
}
if ($sChainTemplate <> '')
{
$strChainTemplate = $sChainTemplate;
}
}
if ($path . '/' == SITE_DIR || $path == '')
{
break;
}
//file or folder
$pos = bxstrrpos($path, "/");
if ($pos === false)
{
break;
}
//parent folder
$path = mb_substr($path, 0, $pos + 1);
}
if ($sNavChainPath !== false)
{
$strChainTemplate = $DOC_ROOT . $sNavChainPath;
}
$arChain = array_reverse($arChain);
$arChain = array_merge($arChain, $this->arAdditionalChain);
if ($iNumFrom > 0)
{
$arChain = array_slice($arChain, $iNumFrom);
}
return $arChain;
}
}
Использовать данный метод в файле result_modifier.php шаблона компонента bitrix:search.page можно таким образом:
$APPLICATION_EXT = new CMainExt;
$itemId = [];
foreach ($arResult["SEARCH"] as &$arItem)
{
$arItem["CHAIN_PATH"] = $APPLICATION_EXT->GetNavChain($arItem["URL"]);
}
Далее можно вывести в шаблоне:
<ul class="breadcrumbs" itemscope itemtype="http://schema.org/BreadcrumbList">
<?php
foreach ($arItem["CHAIN_PATH"] as $i => $arChainItem)
{
?>
<li class="breadcrumbs__item" title="<?php echo $arChainItem["TITLE"]; ?>" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
<a href="<?php echo $arChainItem["LINK"]; ?>" class="breadcrumbs__link" itemprop="item"><span itemprop="name"> <?php echo $arChainItem["TITLE"]; ?> </span></a>
<meta itemprop="position" content="<?php echo (++$i); ?>" />
</li>
<?php
}
?>
</ul>