- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
- Класс: CAllIBlockSection
- Вызов: CAllIBlockSection::GetNavChain
static function GetNavChain($IBLOCK_ID, $SECTION_ID, $arSelect = array(), $arrayResult = false)
{
global $DB;
$arrayResult = ($arrayResult === true);
$IBLOCK_ID = (int)$IBLOCK_ID;
$arFields = array(
"ID" => "BS.ID",
"CODE" => "BS.CODE",
"XML_ID" => "BS.XML_ID",
"EXTERNAL_ID" => "BS.XML_ID",
"IBLOCK_ID" => "BS.IBLOCK_ID",
"IBLOCK_SECTION_ID" => "BS.IBLOCK_SECTION_ID",
"SORT" => "BS.SORT",
"NAME" => "BS.NAME",
"ACTIVE" => "BS.ACTIVE",
"GLOBAL_ACTIVE" => "BS.GLOBAL_ACTIVE",
"PICTURE" => "BS.PICTURE",
"DESCRIPTION" => "BS.DESCRIPTION",
"DESCRIPTION_TYPE" => "BS.DESCRIPTION_TYPE",
"LEFT_MARGIN" => "BS.LEFT_MARGIN",
"RIGHT_MARGIN" => "BS.RIGHT_MARGIN",
"DEPTH_LEVEL" => "BS.DEPTH_LEVEL",
"SEARCHABLE_CONTENT" => "BS.SEARCHABLE_CONTENT",
"MODIFIED_BY" => "BS.MODIFIED_BY",
"CREATED_BY" => "BS.CREATED_BY",
"DETAIL_PICTURE" => "BS.DETAIL_PICTURE",
"TMP_ID" => "BS.TMP_ID",
"LIST_PAGE_URL" => "B.LIST_PAGE_URL",
"SECTION_PAGE_URL" => "B.SECTION_PAGE_URL",
"IBLOCK_TYPE_ID" => "B.IBLOCK_TYPE_ID",
"IBLOCK_CODE" => "B.CODE",
"IBLOCK_EXTERNAL_ID" => "B.XML_ID",
"SOCNET_GROUP_ID" => "BS.SOCNET_GROUP_ID",
);
$arSqlSelect = array();
foreach($arSelect as $field)
{
$field = mb_strtoupper($field);
if (isset($arFields[$field]))
$arSqlSelect[$field] = $arFields[$field]." AS ".$field;
}
if (isset($arSqlSelect["DESCRIPTION"]))
$arSqlSelect["DESCRIPTION_TYPE"] = $arFields["DESCRIPTION_TYPE"]." AS DESCRIPTION_TYPE";
if (isset($arSqlSelect["LIST_PAGE_URL"]) || isset($arSqlSelect["SECTION_PAGE_URL"]))
{
$arSqlSelect["ID"] = $arFields["ID"]." AS ID";
$arSqlSelect["CODE"] = $arFields["CODE"]." AS CODE";
$arSqlSelect["EXTERNAL_ID"] = $arFields["EXTERNAL_ID"]." AS EXTERNAL_ID";
$arSqlSelect["IBLOCK_TYPE_ID"] = $arFields["IBLOCK_TYPE_ID"]." AS IBLOCK_TYPE_ID";
$arSqlSelect["IBLOCK_ID"] = $arFields["IBLOCK_ID"]." AS IBLOCK_ID";
$arSqlSelect["IBLOCK_CODE"] = $arFields["IBLOCK_CODE"]." AS IBLOCK_CODE";
$arSqlSelect["IBLOCK_EXTERNAL_ID"] = $arFields["IBLOCK_EXTERNAL_ID"]." AS IBLOCK_EXTERNAL_ID";
$arSqlSelect["GLOBAL_ACTIVE"] = $arFields["GLOBAL_ACTIVE"]." AS GLOBAL_ACTIVE";
//$arr["LANG_DIR"],
}
if (!empty($arSelect))
{
$field = "IBLOCK_SECTION_ID";
$arSqlSelect[$field] = $arFields[$field]." AS ".$field;
$strSelect = implode(", ", $arSqlSelect);
}
else
{
$strSelect = "
BS.*,
B.LIST_PAGE_URL,
B.SECTION_PAGE_URL,
B.IBLOCK_TYPE_ID,
B.CODE as IBLOCK_CODE,
B.XML_ID as IBLOCK_EXTERNAL_ID,
BS.XML_ID as EXTERNAL_ID
";
}
$key = md5($strSelect);
if (!isset(self::$arSectionNavChainCache[$key]))
self::$arSectionNavChainCache[$key] = array();
$sectionPath = array();
do
{
$SECTION_ID = (int)$SECTION_ID;
if (!isset(self::$arSectionNavChainCache[$key][$SECTION_ID]))
{
$rsSection = $DB->Query("
SELECT
".$strSelect."
FROM
b_iblock_section BS
INNER JOIN b_iblock B ON B.ID = BS.IBLOCK_ID
WHERE BS.ID=".$SECTION_ID."
".($IBLOCK_ID > 0 ? "AND BS.IBLOCK_ID=".$IBLOCK_ID : "")."
");
self::$arSectionNavChainCache[$key][$SECTION_ID] = $rsSection->Fetch();
}
if (self::$arSectionNavChainCache[$key][$SECTION_ID])
{
$sectionPath[] = self::$arSectionNavChainCache[$key][$SECTION_ID];
$SECTION_ID = self::$arSectionNavChainCache[$key][$SECTION_ID]["IBLOCK_SECTION_ID"];
}
else
{
$SECTION_ID = 0;
}
}
while ($SECTION_ID > 0);
$sectionPath = array_reverse($sectionPath);
if ($arrayResult)
return $sectionPath;
$res = new CDBResult;
$res->InitFromArray($sectionPath);
$res = new CIBlockResult($res);
$res->bIBlockSection = true;
return $res;
}