static function Delete($ID)
{
global $DB, $APPLICATION, $USER;
$USER_ID = is_object($USER)? (int)$USER->GetID() : 0;
$ID = (int)$ID;
if ($ID <= 0)
{
return false;
}
$APPLICATION->ResetException();
foreach (GetModuleEvents("iblock", "OnBeforeIBlockElementDelete", true) as $arEvent)
{
if(ExecuteModuleEventEx($arEvent, array($ID))===false)
{
$err = "";
$err_id = false;
$ex = $APPLICATION->GetException();
if (is_object($ex))
{
$err = $ex->GetString();
$err_id = $ex->GetID();
}
$APPLICATION->throwException($err, $err_id);
return false;
}
}
$arSql = array(
"ID='".$ID."'",
"WF_PARENT_ELEMENT_ID='".$ID."'",
);
foreach($arSql as $strWhere)
{
$strSql = "
SELECT
ID
,IBLOCK_ID
,WF_PARENT_ELEMENT_ID
,WF_STATUS_ID
,PREVIEW_PICTURE
,DETAIL_PICTURE
,XML_ID as EXTERNAL_ID
,CODE
,NAME
FROM b_iblock_element
WHERE ".$strWhere."
ORDER BY ID DESC
";
$z = $DB->Query($strSql);
while ($zr = $z->Fetch())
{
$elementId = (int)$zr["ID"];
$VERSION = CIBlockElement::GetIBVersion($zr["IBLOCK_ID"]);
$db_res = CIBlockElement::GetProperty($zr["IBLOCK_ID"], $zr["ID"], "sort", "asc", array("PROPERTY_TYPE"=>"F"));
$arIBlockFields = CIBlock::GetArrayByID($zr["IBLOCK_ID"], "FIELDS");
if(
(int)$zr["WF_PARENT_ELEMENT_ID"]<=0
&& $arIBlockFields["LOG_ELEMENT_DELETE"]["IS_REQUIRED"] == "Y"
)
{
$arEvents = GetModuleEvents("main", "OnBeforeEventLog", true);
if(empty($arEvents) || ExecuteModuleEventEx($arEvents[0], array($USER_ID))===false)
{
$rsElement = CIBlockElement::GetList(array(), array("=ID"=>$ID), false, false, array("LIST_PAGE_URL", "NAME", "CODE"));
$arElement = $rsElement->GetNext();
$arIblock = CIBlock::GetArrayByID($zr['IBLOCK_ID']);
$res_log = array(
"ID" => $ID,
"CODE" => $arElement["CODE"],
"NAME" => $arElement["NAME"],
"ELEMENT_NAME" => $arIblock["ELEMENT_NAME"],
"USER_ID" => $USER_ID,
"IBLOCK_PAGE_URL" => $arElement["LIST_PAGE_URL"],
);
CEventLog::Log(
"IBLOCK",
"IBLOCK_ELEMENT_DELETE",
"iblock",
$zr["IBLOCK_ID"],
serialize($res_log)
);
}
}
$piId = BitrixIblockPropertyIndexManager::resolveElement($zr["IBLOCK_ID"], $zr["ID"]);
foreach (GetModuleEvents("iblock", "OnIBlockElementDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($elementId, $zr));
while($res = $db_res->Fetch())
CIBlockElement::DeleteFile($res["VALUE"], $zr["ID"], "PROPERTY", $zr["WF_PARENT_ELEMENT_ID"], $zr["IBLOCK_ID"]);
if($VERSION==2)
{
if(!$DB->Query("DELETE FROM b_iblock_element_prop_m".$zr["IBLOCK_ID"]." WHERE IBLOCK_ELEMENT_ID = ".$elementId))
return false;
if(!$DB->Query("DELETE FROM b_iblock_element_prop_s".$zr["IBLOCK_ID"]." WHERE IBLOCK_ELEMENT_ID = ".$elementId))
return false;
}
else
{
if(!$DB->Query("DELETE FROM b_iblock_element_property WHERE IBLOCK_ELEMENT_ID = ".$elementId))
return false;
}
static $arDelCache = array();
if(!is_set($arDelCache, $zr["IBLOCK_ID"]))
{
$arDelCache[$zr["IBLOCK_ID"]] = [];
$db_ps = $DB->Query("SELECT ID,IBLOCK_ID,VERSION,MULTIPLE FROM b_iblock_property WHERE PROPERTY_TYPE='E' AND (LINK_IBLOCK_ID=".$zr["IBLOCK_ID"]." OR LINK_IBLOCK_ID=0 OR LINK_IBLOCK_ID IS NULL)");
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[$zr["IBLOCK_ID"]][$strTable][] = $ar_ps["ID"];
}
}
if($arDelCache[$zr["IBLOCK_ID"]])
{
foreach($arDelCache[$zr["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."=".$zr["ID"];
if(!$DB->Query($strSql))
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=".$zr["ID"];
$rs = $DB->Query($strSql);
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))
return false;
}
$strSql = "DELETE FROM ".$strTable." WHERE IBLOCK_PROPERTY_ID IN (".implode(", ", $arProps).") AND VALUE_NUM=".$zr["ID"];
if(!$DB->Query($strSql))
return false;
}
else
{
$strSql = "DELETE FROM ".$strTable." WHERE IBLOCK_PROPERTY_ID IN (".implode(", ", $arProps).") AND VALUE_NUM=".$zr["ID"];
if(!$DB->Query($strSql))
return false;
}
}
}
if(!$DB->Query("DELETE FROM b_iblock_section_element WHERE IBLOCK_ELEMENT_ID = ".$elementId))
return false;
$obIBlockElementRights = new CIBlockElementRights($zr["IBLOCK_ID"], $zr["ID"]);
$obIBlockElementRights->DeleteAllRights();
$ipropTemplates = new BitrixIblockInheritedPropertyElementTemplates($zr["IBLOCK_ID"], $zr["ID"]);
$ipropTemplates->delete();
if((int)$zr["WF_PARENT_ELEMENT_ID"]<=0 && $zr["WF_STATUS_ID"]==1 && CModule::IncludeModule("search"))
{
CSearch::DeleteIndex("iblock", $elementId);
}
CIBlockElement::DeleteFile($zr["PREVIEW_PICTURE"], $zr["ID"], "PREVIEW", $zr["WF_PARENT_ELEMENT_ID"], $zr["IBLOCK_ID"]);
CIBlockElement::DeleteFile($zr["DETAIL_PICTURE"], $zr["ID"], "DETAIL", $zr["WF_PARENT_ELEMENT_ID"], $zr["IBLOCK_ID"]);
if(CModule::IncludeModule("workflow"))
$DB->Query("DELETE FROM b_workflow_move WHERE IBLOCK_ELEMENT_ID=".$elementId);
$DB->Query("DELETE FROM b_iblock_element_lock WHERE IBLOCK_ELEMENT_ID=".$elementId);
$DB->Query("DELETE FROM b_rating_vote WHERE ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND ENTITY_ID = ".$elementId);
$DB->Query("DELETE FROM b_rating_voting WHERE ENTITY_TYPE_ID = 'IBLOCK_ELEMENT' AND ENTITY_ID = ".$elementId);
if(!$DB->Query("DELETE FROM b_iblock_element WHERE ID=".$elementId))
return false;
if (isset(self::$elementIblock[$elementId]))
unset(self::$elementIblock[$elementId]);
BitrixIblockPropertyIndexManager::deleteElementIndex($zr["IBLOCK_ID"], $piId);
if(CModule::IncludeModule("bizproc"))
{
$arErrorsTmp = [];
CBPDocument::OnDocumentDelete(["iblock", "CIBlockDocument", $zr["ID"]], $arErrorsTmp);
}
foreach (GetModuleEvents("iblock", "OnAfterIBlockElementDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($zr));
CIBlock::clearIblockTagCache($zr['IBLOCK_ID']);
IblockElementTable::cleanCache();
unset($elementId);
}
}
/************* QUOTA *************/
CDiskQuota::recalculateDb();
/************* QUOTA *************/
return true;
}