• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
  • Класс: CAllIBlockElement
  • Вызов: CAllIBlockElement::RecalcSections
static function RecalcSections($ID, $sectionId = null)
{
	global $DB;
	$ID = (int)$ID;

	$sectionId = (int)$sectionId;
	if ($sectionId > 0)
	{
		$res = $DB->Query("
			SELECT
				SE.IBLOCK_SECTION_ID as IBLOCK_SECTION_ID_NEW
				,E.IBLOCK_SECTION_ID
				,E.IN_SECTIONS
				,E.IBLOCK_ID
			FROM
				b_iblock_section_element SE
				INNER JOIN b_iblock_element E ON E.ID = SE.IBLOCK_ELEMENT_ID
			WHERE
				SE.IBLOCK_ELEMENT_ID = ".$ID."
				AND SE.IBLOCK_SECTION_ID = ".$sectionId."
				AND SE.ADDITIONAL_PROPERTY_ID IS NULL
		");
		$res = $res->Fetch();
		if ($res)
		{
			$oldInSections = $res["IN_SECTIONS"];
			$newInSections = "Y";
			$oldSectionId = (int)$res["IBLOCK_SECTION_ID"];
			$newSectionId = (int)$res["IBLOCK_SECTION_ID_NEW"];
		}
		else
		{
			//No such section linked to the element
			return;
		}
	}
	else
	{
		$res = $DB->Query("
			SELECT
				COUNT('x') as C
				,MIN(SE.IBLOCK_SECTION_ID) as MIN_IBLOCK_SECTION_ID
				,E.IBLOCK_SECTION_ID
				,E.IN_SECTIONS
				,E.IBLOCK_ID
			FROM
				b_iblock_section_element SE
				INNER JOIN b_iblock_element E ON E.ID = SE.IBLOCK_ELEMENT_ID
			WHERE
				SE.IBLOCK_ELEMENT_ID = ".$ID."
				AND SE.ADDITIONAL_PROPERTY_ID IS NULL
			GROUP BY
				E.IBLOCK_SECTION_ID
				,E.IN_SECTIONS
				,E.IBLOCK_ID
		");
		$res = $res->Fetch();
		if ($res)
		{
			$oldInSections = $res["IN_SECTIONS"];
			$newInSections = ($res["C"] > 0? "Y": "N");
			$oldSectionId = (int)$res["IBLOCK_SECTION_ID"];
			$newSectionId = (int)$res["MIN_IBLOCK_SECTION_ID"];

			$arIBlock = CIBlock::GetArrayByID($res["IBLOCK_ID"]);
			if (
				$arIBlock["FIELDS"]["IBLOCK_SECTION"]["DEFAULT_VALUE"]["KEEP_IBLOCK_SECTION_ID"] === "Y"
				&& $oldInSections === $newInSections
			)
			{
				$res2 = $DB->Query("
					SELECT
						SE.IBLOCK_SECTION_ID
					FROM
						b_iblock_section_element SE
					WHERE
						SE.IBLOCK_ELEMENT_ID = ".$ID."
						AND SE.IBLOCK_SECTION_ID = ".$oldSectionId."
						AND SE.ADDITIONAL_PROPERTY_ID IS NULL
				");
				$res2 = $res2->Fetch();
				if ($res2)
				{
					//We'll keep IBLOCK_SECTION_ID
					return;
				}
			}
		}
		else
		{
			//No such element
			$oldInSections = "";
			$newInSections = "N";
			$oldSectionId = 0;
			$newSectionId = 0;
		}
	}

	if (
		$oldInSections != $newInSections
		|| ($oldSectionId != $newSectionId)
	)
	{
		$DB->Query("
			UPDATE b_iblock_element SET
				IN_SECTIONS = '".$newInSections."',
				IBLOCK_SECTION_ID= ".($newSectionId > 0? $newSectionId: "NULL")."
			WHERE
				ID = ".$ID."
		");
	}
}