• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
  • Класс: CAllIBlockSection
  • Вызов: CAllIBlockSection::Delete
static function Delete($ID, $bCheckPermissions = true)
{
	$err_mess = "FILE: ".__FILE__."
LINE: "; global $DB, $APPLICATION, $USER; $ID = (int)$ID; if ($ID <= 0) { return false; } $APPLICATION->ResetException(); foreach (GetModuleEvents("iblock", "OnBeforeIBlockSectionDelete", true) as $arEvent) { if(ExecuteModuleEventEx($arEvent, array($ID))===false) { $err = GetMessage("MAIN_BEFORE_DEL_ERR").' '.$arEvent['TO_NAME']; if($ex = $APPLICATION->GetException()) $err .= ': '.$ex->GetString(); $APPLICATION->ThrowException($err); return false; } } $s = CIBlockSection::GetList(Array(), Array("ID"=>$ID, "CHECK_PERMISSIONS"=>($bCheckPermissions? "Y": "N"))); if($s = $s->Fetch()) { CIBlock::_transaction_lock($s["IBLOCK_ID"]); $iblockelements = CIBlockElement::GetList( array(), array("SECTION_ID" => $ID, "SHOW_HISTORY" => "Y", "IBLOCK_ID" => $s["IBLOCK_ID"]), false, false, array("ID", "IBLOCK_ID", "WF_PARENT_ELEMENT_ID", "IBLOCK_SECTION_ID") ); while($iblockelement = $iblockelements->Fetch()) { $elementId = (int)$iblockelement["ID"]; $strSql = " SELECT IBLOCK_SECTION_ID FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID = ".$elementId." AND IBLOCK_SECTION_ID<>".$ID." AND ADDITIONAL_PROPERTY_ID IS NULL ORDER BY IBLOCK_SECTION_ID "; $db_section_element = $DB->Query($strSql); if($ar_section_element = $db_section_element->Fetch()) { if ((int)$iblockelement["IBLOCK_SECTION_ID"] == $ID) { $DB->Query(" UPDATE b_iblock_element SET IBLOCK_SECTION_ID=".$ar_section_element["IBLOCK_SECTION_ID"]." WHERE ID=".$elementId." ", false, $err_mess . __LINE__); } } elseif((int)$iblockelement["WF_PARENT_ELEMENT_ID"]<=0) { if(!CIBlockElement::Delete($iblockelement["ID"])) return false; } else { $DB->Query(" UPDATE b_iblock_element SET IBLOCK_SECTION_ID=NULL, IN_SECTIONS='N' WHERE ID=".$elementId." ", false, $err_mess.__LINE__); } unset($elementId); } $iblocksections = CIBlockSection::GetList( array(), array("SECTION_ID"=>$ID, "CHECK_PERMISSIONS"=>($bCheckPermissions? "Y": "N")), false, array("ID") ); while($iblocksection = $iblocksections->Fetch()) { if(!CIBlockSection::Delete($iblocksection["ID"], $bCheckPermissions)) return false; } CFile::Delete($s["PICTURE"]); CFile::Delete($s["DETAIL_PICTURE"]); static $arDelCache; if(!is_array($arDelCache)) $arDelCache = Array(); if (!isset($arDelCache[$s["IBLOCK_ID"]])) { $arDelCache[$s["IBLOCK_ID"]] = []; $db_ps = $DB->Query("SELECT ID,IBLOCK_ID,VERSION,MULTIPLE FROM b_iblock_property WHERE PROPERTY_TYPE='G' AND (LINK_IBLOCK_ID=".$s["IBLOCK_ID"]." OR LINK_IBLOCK_ID=0 OR LINK_IBLOCK_ID IS NULL)", false, $err_mess.__LINE__); while($ar_ps = $db_ps->Fetch()) { if($ar_ps["VERSION"]==2) { if($ar_ps["MULTIPLE"]=="Y") $strTable = "b_iblock_element_prop_m".$ar_ps["IBLOCK_ID"]; else $strTable = "b_iblock_element_prop_s".$ar_ps["IBLOCK_ID"]; } else { $strTable = "b_iblock_element_property"; } if (!isset($arDelCache[$s["IBLOCK_ID"]][$strTable])) { $arDelCache[$s["IBLOCK_ID"]][$strTable] = []; } $arDelCache[$s["IBLOCK_ID"]][$strTable][] = $ar_ps["ID"]; } } if (!empty($arDelCache[$s["IBLOCK_ID"]])) { foreach($arDelCache[$s["IBLOCK_ID"]] as $strTable=>$arProps) { if(strncmp("b_iblock_element_prop_s", $strTable, 23)==0) { $tableFields = $DB->GetTableFields($strTable); foreach($arProps as $prop_id) { $strSql = "UPDATE ".$strTable." SET PROPERTY_".$prop_id."=null"; if (isset($tableFields["DESCRIPTION_".$prop_id])) $strSql .= ",DESCRIPTION_".$prop_id."=null"; $strSql .= " WHERE PROPERTY_".$prop_id."=".$s["ID"]; if(!$DB->Query($strSql, false, $err_mess.__LINE__)) return false; } } elseif(strncmp("b_iblock_element_prop_m", $strTable, 23)==0) { $tableFields = $DB->GetTableFields(str_replace("prop_m", "prop_s", $strTable)); $strSql = "SELECT IBLOCK_PROPERTY_ID, IBLOCK_ELEMENT_ID FROM ".$strTable." WHERE IBLOCK_PROPERTY_ID IN (".implode(", ", $arProps).") AND VALUE_NUM=".$s["ID"]; $rs = $DB->Query($strSql, false, $err_mess.__LINE__); while($ar = $rs->Fetch()) { $strSql = " UPDATE ".str_replace("prop_m", "prop_s", $strTable)." SET PROPERTY_".$ar["IBLOCK_PROPERTY_ID"]."=null ".(isset($tableFields["DESCRIPTION_".$ar["IBLOCK_PROPERTY_ID"]])? ",DESCRIPTION_".$ar["IBLOCK_PROPERTY_ID"]."=null": "")." WHERE IBLOCK_ELEMENT_ID = ".$ar["IBLOCK_ELEMENT_ID"]." "; if(!$DB->Query($strSql, false, $err_mess.__LINE__)) return false; } $strSql = "DELETE FROM ".$strTable." WHERE IBLOCK_PROPERTY_ID IN (".implode(", ", $arProps).") AND VALUE_NUM=".$s["ID"]; if(!$DB->Query($strSql, false, $err_mess.__LINE__)) return false; } else { $strSql = "DELETE FROM ".$strTable." WHERE IBLOCK_PROPERTY_ID IN (".implode(", ", $arProps).") AND VALUE_NUM=".$s["ID"]; if(!$DB->Query($strSql, false, $err_mess.__LINE__)) return false; } } } CIBlockSectionPropertyLink::DeleteBySection($ID); $DB->Query("DELETE FROM b_iblock_section_element WHERE IBLOCK_SECTION_ID=".$ID, false, $err_mess.__LINE__); if(CModule::IncludeModule("search")) CSearch::DeleteIndex("iblock", "S".$ID); $GLOBALS["USER_FIELD_MANAGER"]->Delete("IBLOCK_".$s["IBLOCK_ID"]."_SECTION", $ID); //Delete the hole in the tree self::recountTreeOnDelete($s); $obSectionRights = new CIBlockSectionRights($s["IBLOCK_ID"], $ID); $obSectionRights->DeleteAllRights(); $ipropTemplates = new BitrixIblockInheritedPropertySectionTemplates($s["IBLOCK_ID"], $ID); $ipropTemplates->delete(); /************* QUOTA *************/ CDiskQuota::recalculateDb(); /************* QUOTA *************/ $arIBlockFields = CIBlock::GetArrayByID($s["IBLOCK_ID"], "FIELDS"); if($arIBlockFields["LOG_SECTION_DELETE"]["IS_REQUIRED"] == "Y") { $USER_ID = is_object($USER)? intval($USER->GetID()) : 0; $arEvents = GetModuleEvents("main", "OnBeforeEventLog", true); if(empty($arEvents) || ExecuteModuleEventEx($arEvents[0], array($USER_ID))===false) { $rsSection = CIBlockSection::GetList( array(), array("=ID"=>$ID, "CHECK_PERMISSIONS"=>($bCheckPermissions? "Y": "N")), false, array("LIST_PAGE_URL", "NAME", "CODE") ); $arSection = $rsSection->GetNext(); $res = array( "ID" => $ID, "CODE" => $arSection["CODE"], "NAME" => $arSection["NAME"], "SECTION_NAME" => CIBlock::GetArrayByID($s["IBLOCK_ID"], "SECTION_NAME"), "USER_ID" => $USER_ID, "IBLOCK_PAGE_URL" => $arSection["LIST_PAGE_URL"], ); CEventLog::Log( "IBLOCK", "IBLOCK_SECTION_DELETE", "iblock", $s["IBLOCK_ID"], serialize($res) ); } } $res = $DB->Query("DELETE FROM b_iblock_section WHERE ID=".$ID, false, $err_mess.__LINE__); if($res) { foreach (GetModuleEvents("iblock", "OnAfterIBlockSectionDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($s)); CIBlock::clearIblockTagCache($s['IBLOCK_ID']); } return $res; } return true; }