• Модуль: 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;
}