• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
  • Класс: CAllIBlockElement
  • Вызов: CAllIBlockElement::Delete
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;
}