• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
  • Класс: CAllIBlockSection
  • Вызов: CAllIBlockSection::RecalcGlobalActiveFlag
static function RecalcGlobalActiveFlag($arSection, $distance = 0)
{
	global $DB;

	$distance = (int)$distance;
	$arSection['LEFT_MARGIN'] += $distance;
	$arSection['RIGHT_MARGIN'] += $distance;

	//Make all children globally active
	$DB->Query("
		UPDATE b_iblock_section SET
			TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")."
			,GLOBAL_ACTIVE = 'Y'
		WHERE
			IBLOCK_ID = ".$arSection["IBLOCK_ID"]."
			AND LEFT_MARGIN >= ".intval($arSection["LEFT_MARGIN"])."
			AND RIGHT_MARGIN <= ".intval($arSection["RIGHT_MARGIN"])."
	");
	//Select those who is not active
	$strSql = "
		SELECT ID, LEFT_MARGIN, RIGHT_MARGIN
		FROM b_iblock_section
		WHERE IBLOCK_ID = ".$arSection["IBLOCK_ID"]."
		AND LEFT_MARGIN >= ".intval($arSection["LEFT_MARGIN"])."
		AND RIGHT_MARGIN <= ".intval($arSection["RIGHT_MARGIN"])."
		AND ACTIVE = 'N'
		ORDER BY LEFT_MARGIN
	";
	$arUpdate = array();
	$prev_right = 0;
	$rsChildren = $DB->Query($strSql);
	while($arChild = $rsChildren->Fetch())
	{
		if($arChild["RIGHT_MARGIN"] > $prev_right)
		{
			$prev_right = $arChild["RIGHT_MARGIN"];
			$arUpdate[] = "(LEFT_MARGIN >= ".$arChild["LEFT_MARGIN"]." AND RIGHT_MARGIN <= ".$arChild["RIGHT_MARGIN"].")n";
		}
	}
	if(count($arUpdate) > 0)
	{
		$DB->Query("
			UPDATE b_iblock_section SET
				TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")."
				,GLOBAL_ACTIVE = 'N'
			WHERE
				IBLOCK_ID = ".$arSection["IBLOCK_ID"]."
				AND (".implode(" OR ", $arUpdate).")
		");
	}
}