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