- Модуль: iblock
- Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
- Класс: CAllIBlockElement
- Вызов: CAllIBlockElement::SetElementSection
static function SetElementSection($ID, $arSections, $bNew = false, $bRightsIBlock = 0, $sectionId = null)
{
global $DB;
$ID = intval($ID);
$min_old_id = null;
$min_new_id = null;
$arToDelete = array();
$arToInsert = array();
if(is_array($arSections))
{
foreach($arSections as $section_id)
{
$section_id = intval($section_id);
if($section_id > 0)
{
if(!isset($min_new_id) || $section_id < $min_new_id)
$min_new_id = $section_id;
$arToInsert[$section_id] = $section_id;
}
}
}
else
{
$section_id = intval($arSections);
if($section_id > 0)
{
$arToInsert[$section_id] = $section_id;
$min_new_id = $section_id;
}
}
$originalInsert = $arToInsert;
$additionalInsert = array();
$arOldParents = array();
$arNewParents = $arToInsert;
$bParentsChanged = false;
//Read database
if(!$bNew)
{
$rs = $DB->Query("
SELECT * FROM b_iblock_section_element
WHERE IBLOCK_ELEMENT_ID = ".$ID."
AND ADDITIONAL_PROPERTY_ID IS NULL
", false, "File: ".__FILE__."
Line: ".__LINE__);
while($ar = $rs->Fetch())
{
$section_id = intval($ar["IBLOCK_SECTION_ID"]);
$arOldParents[] = $section_id;
if(!isset($min_old_id) || $section_id < $min_old_id)
$min_old_id = $section_id;
if(isset($arToInsert[$section_id]))
{
unset($arToInsert[$section_id]); //This already in DB
}
else
{
if (isset($originalInsert[$section_id]))
$additionalInsert[$section_id] = $section_id;
$arToDelete[] = $section_id;
}
}
if(!empty($arToDelete))
{
$bParentsChanged = true;
$DB->Query($s="
DELETE FROM b_iblock_section_element
WHERE IBLOCK_ELEMENT_ID = ".$ID."
AND ADDITIONAL_PROPERTY_ID IS NULL
AND IBLOCK_SECTION_ID in (".implode(", ", $arToDelete).")
", false, "File: ".__FILE__."
Line: ".__LINE__); //And this should be deleted
}
if (!empty($additionalInsert))
{
foreach ($additionalInsert as $index)
$arToInsert[$index] = $index;
}
}
if(!empty($arToInsert))
{
$bParentsChanged = true;
$DB->Query("
INSERT INTO b_iblock_section_element(IBLOCK_SECTION_ID, IBLOCK_ELEMENT_ID)
SELECT S.ID, E.ID
FROM b_iblock_section S, b_iblock_element E
WHERE S.IBLOCK_ID = E.IBLOCK_ID
AND S.ID IN (".implode(", ", $arToInsert).")
AND E.ID = ".$ID."
");
}
if($bParentsChanged && $bRightsIBlock)
{
$obElementRights = new CIBlockElementRights($bRightsIBlock, $ID);
if(empty($arOldParents))
$arOldParents[] = 0;
if(empty($arNewParents))
$arNewParents[] = 0;
$obElementRights->ChangeParents($arOldParents, $arNewParents);
}
if($sectionId !== null || ($min_old_id !== $min_new_id))
{
CIBlockElement::RecalcSections($ID, $sectionId);
}
return !empty($arToDelete) || !empty($arToInsert);
}