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; } } $arOldParents = array(); $arNewParents = $arToInsert; $bParentsChanged = false; //Read database if (!$bNew) { $rs = $DB->Query("\n\t\t\t\tSELECT * FROM b_iblock_section_element\n\t\t\t\tWHERE IBLOCK_ELEMENT_ID = " . $ID . "\n\t\t\t\tAND ADDITIONAL_PROPERTY_ID IS NULL\n\t\t\t", false, "File: " . __FILE__ . "<br>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 { $arToDelete[] = $section_id; } } if (!empty($arToDelete)) { $bParentsChanged = true; $DB->Query($s = "\n\t\t\t\t\tDELETE FROM b_iblock_section_element\n\t\t\t\t\tWHERE IBLOCK_ELEMENT_ID = " . $ID . "\n\t\t\t\t\tAND ADDITIONAL_PROPERTY_ID IS NULL\n\t\t\t\t\tAND IBLOCK_SECTION_ID in (" . implode(", ", $arToDelete) . ")\n\t\t\t\t", false, "File: " . __FILE__ . "<br>Line: " . __LINE__); //And this should be deleted } } if (!empty($arToInsert)) { $bParentsChanged = true; $DB->Query("\n\t\t\t\tINSERT INTO b_iblock_section_element(IBLOCK_SECTION_ID, IBLOCK_ELEMENT_ID)\n\t\t\t\tSELECT S.ID, E.ID\n\t\t\t\tFROM b_iblock_section S, b_iblock_element E\n\t\t\t\tWHERE S.IBLOCK_ID = E.IBLOCK_ID\n\t\t\t\tAND S.ID IN (" . implode(", ", $arToInsert) . ")\n\t\t\t\tAND E.ID = " . $ID . "\n\t\t\t"); } 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); }