public static function Delete($ID, $bCheckPermissions = true) { $err_mess = "FILE: ".__FILE__."<br>LINE: "; global $DB, $APPLICATION, $USER; $ID = IntVal($ID); $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")); while($iblockelement = $iblockelements->Fetch()) { $strSql = " SELECT IBLOCK_SECTION_ID FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID = ".$iblockelement["ID"]." 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()) { $DB->Query(" UPDATE b_iblock_element SET IBLOCK_SECTION_ID=".$ar_section_element["IBLOCK_SECTION_ID"]." WHERE ID=".IntVal($iblockelement["ID"])." ", false, $err_mess.__LINE__); } elseif(IntVal($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=".IntVal($iblockelement["ID"])." ", false, $err_mess.__LINE__); } } $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(!is_set($arDelCache, $s["IBLOCK_ID"])) { $arDelCache[$s["IBLOCK_ID"]] = false; $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"; } $arDelCache[$s["IBLOCK_ID"]][$strTable][] = $ar_ps["ID"]; } } if($arDelCache[$s["IBLOCK_ID"]]) { foreach($arDelCache[$s["IBLOCK_ID"]] as $strTable=>$arProps) { if(strncmp("b_iblock_element_prop_s", $strTable, 23)==0) { foreach($arProps as $prop_id) { $strSql = "UPDATE ".$strTable." SET PROPERTY_".$prop_id."=null,DESCRIPTION_".$prop_id."=null 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) { $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, 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=".IntVal($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 $ss = $DB->Query(" SELECT IBLOCK_ID, LEFT_MARGIN, RIGHT_MARGIN FROM b_iblock_section WHERE ID = ".$s["ID"]." "); $ss = $ss->Fetch(); if(($ss["RIGHT_MARGIN"] > 0) && ($ss["LEFT_MARGIN"] > 0)) { $DB->Query(" UPDATE b_iblock_section SET TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")." ,RIGHT_MARGIN = RIGHT_MARGIN - 2 WHERE IBLOCK_ID = ".$ss["IBLOCK_ID"]." AND RIGHT_MARGIN > ".$ss["RIGHT_MARGIN"]." "); $DB->Query(" UPDATE b_iblock_section SET TIMESTAMP_X=".($DB->type=="ORACLE"?"NULL":"TIMESTAMP_X")." ,LEFT_MARGIN = LEFT_MARGIN - 2 WHERE IBLOCK_ID = ".$ss["IBLOCK_ID"]." AND LEFT_MARGIN > ".$ss["LEFT_MARGIN"]." "); } $obSectionRights = new CIBlockSectionRights($s["IBLOCK_ID"], $ID); $obSectionRights->DeleteAllRights(); $ipropTemplates = new \Freetrix\Iblock\InheritedProperty\SectionTemplates($s["IBLOCK_ID"], $ID); $ipropTemplates->delete(); /************* QUOTA *************/ $_SESSION["SESS_RECOUNT_DB"] = "Y"; /************* 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=".IntVal($ID), false, $err_mess.__LINE__); if($res) { foreach (GetModuleEvents("iblock", "OnAfterIBlockSectionDelete", true) as $arEvent) ExecuteModuleEventEx($arEvent, array($s)); if(defined("FX_COMP_MANAGED_CACHE")) $GLOBALS["CACHE_MANAGER"]->ClearByTag("iblock_id_".$s["IBLOCK_ID"]); } return $res; } return true; }
$str_NAME = htmlspecialcharsbx($arIBlock["FIELDS"]["SECTION_NAME"]["DEFAULT_VALUE"]); $str_DESCRIPTION_TYPE = $arIBlock["FIELDS"]["SECTION_DESCRIPTION_TYPE"]["DEFAULT_VALUE"] !== "html"? "text": "html"; $str_DESCRIPTION = htmlspecialcharsbx($arIBlock["FIELDS"]["SECTION_DESCRIPTION"]["DEFAULT_VALUE"]); $str_SORT="500"; $str_IBLOCK_SECTION_ID = $IBLOCK_SECTION_ID; $result = CIBlockSection::GetByID($ID); $arSection = $result->ExtractFields("str_"); if(!$arSection) { $ID = 0; $ipropTemlates = new \Freetrix\Iblock\InheritedProperty\SectionTemplates($IBLOCK_ID, 0); } else { $ipropTemlates = new \Freetrix\Iblock\InheritedProperty\SectionTemplates($IBLOCK_ID, $ID); } if($bVarsFromForm) { $DB->InitTableVarsForEdit("b_iblock_section", "", "str_"); $str_IPROPERTY_TEMPLATES = $_POST["IPROPERTY_TEMPLATES"]; } else { $str_IPROPERTY_TEMPLATES = $ipropTemlates->findTemplates(); $str_IPROPERTY_TEMPLATES["SECTION_PICTURE_FILE_NAME"] = \Freetrix\Iblock\Template\Helper::convertModifiersToArray($str_IPROPERTY_TEMPLATES["SECTION_PICTURE_FILE_NAME"]); $str_IPROPERTY_TEMPLATES["SECTION_DETAIL_PICTURE_FILE_NAME"] = \Freetrix\Iblock\Template\Helper::convertModifiersToArray($str_IPROPERTY_TEMPLATES["SECTION_DETAIL_PICTURE_FILE_NAME"]); $str_IPROPERTY_TEMPLATES["ELEMENT_PREVIEW_PICTURE_FILE_NAME"] = \Freetrix\Iblock\Template\Helper::convertModifiersToArray($str_IPROPERTY_TEMPLATES["ELEMENT_PREVIEW_PICTURE_FILE_NAME"]); $str_IPROPERTY_TEMPLATES["ELEMENT_DETAIL_PICTURE_FILE_NAME"] = \Freetrix\Iblock\Template\Helper::convertModifiersToArray($str_IPROPERTY_TEMPLATES["ELEMENT_DETAIL_PICTURE_FILE_NAME"]); }