Разное

Метод, который возвращает навигационную цепочку в виде массива

Потребовался метод, который возвращает навигационную цепочки в форме архива. Такой метод может потребоваться, например, для того, чтобы в поиске показывать не только найденный документ, но и путь к нему.

В 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>

Отставить комментарий

Ваш электронный адрес не будет опубликован.Обязательные для заполнения поля отмечены *

8 + шестнадцать =