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;
}