• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblockelement.php
  • Класс: CAllIBlockElement
  • Вызов: CAllIBlockElement::DeleteFile
static function DeleteFile($FILE_ID, $ELEMENT_ID, $TYPE = false, $PARENT_ID = -1, $IBLOCK_ID = false, $bCheckOnly = false)
{
	global $DB;

	$FILE_ID = (int)$FILE_ID;
	if($FILE_ID <= 0)
		return;

	if($ELEMENT_ID !== false)
	{//ELEMENT_ID may be false when we are going to check for a valid file from CheckFields
		$ELEMENT_ID = (int)$ELEMENT_ID;
		if($ELEMENT_ID <= 0)
			return;
	}

	$IBLOCK_ID = (int)$IBLOCK_ID;
	if($IBLOCK_ID <= 0 || $PARENT_ID===-1)
	{
		if($ELEMENT_ID===false)
			return; //This is an error in API call
		$rsElement = $DB->Query("SELECT IBLOCK_ID, WF_PARENT_ELEMENT_ID from b_iblock_element WHERE ID = ".$ELEMENT_ID);
		$arElement = $rsElement->Fetch();
		if(!$arElement)
			return;
		$IBLOCK_ID = $arElement["IBLOCK_ID"];
		$PARENT_ID = $arElement["WF_PARENT_ELEMENT_ID"];
	}

	if($TYPE === false)
	{
		$CNT = CIBlockElement::DeleteFile($FILE_ID, $ELEMENT_ID, "PREVIEW", $PARENT_ID, $IBLOCK_ID);
		$CNT += CIBlockElement::DeleteFile($FILE_ID, $ELEMENT_ID, "DETAIL", $PARENT_ID, $IBLOCK_ID);
		$CNT += CIBlockElement::DeleteFile($FILE_ID, $ELEMENT_ID, "PROPERTY", $PARENT_ID, $IBLOCK_ID);
		return $CNT;
	}

	$VERSION = CIBlockElement::GetIBVersion($IBLOCK_ID);

	$arProps = array();
	if($TYPE === "PROPERTY" && $VERSION==2)
	{
		$strSQL = "
			SELECT P.ID
			FROM
			b_iblock_property P
			WHERE P.IBLOCK_ID = ".$IBLOCK_ID."
			AND P.PROPERTY_TYPE = 'F'
			AND P.MULTIPLE = 'N'
		";
		$rs = $DB->Query($strSQL);
		while($ar = $rs->Fetch())
			$arProps[] = " V.PROPERTY_".(int)$ar["ID"]." = ".$FILE_ID;
	}

	if($ELEMENT_ID === false)
	{
		//It is new historical record so we'' check original
		//and all over history already there
		$arWhere = array(
			"E.ID=".(int)$PARENT_ID,
			"E.WF_PARENT_ELEMENT_ID=".(int)$PARENT_ID
		);
	}
	elseif((int)$PARENT_ID)
	{
		//It's an historical record so we will check original
		// and all history except deleted one
		$arWhere = array(
			"E.ID=".(int)$PARENT_ID,
			"E.WF_PARENT_ELEMENT_ID=".(int)$PARENT_ID." AND E.ID <> ".$ELEMENT_ID
		);
	}
	else
	{
		//It is an original so we have to check only history
		//all history copies
		$arWhere = array(
			"E.WF_PARENT_ELEMENT_ID=".$ELEMENT_ID
		);
	}

	$CNT = 0;
	foreach($arWhere as $strWhere)
	{
		if($TYPE === "PREVIEW")
		{
			$strSQL = "
				SELECT COUNT(1) CNT
				from b_iblock_element E
				WHERE ".$strWhere."
				AND PREVIEW_PICTURE = ".$FILE_ID."
			";

		}
		elseif($TYPE === "DETAIL")
		{
			$strSQL = "
				SELECT COUNT(1) CNT
				from b_iblock_element E
				WHERE ".$strWhere."
				AND DETAIL_PICTURE = ".$FILE_ID."
			";
		}
		elseif($TYPE === "PROPERTY")
		{
			if($VERSION==2)
			{
				$strSQL = "
					SELECT COUNT(1) CNT
					FROM
						b_iblock_element E
						,b_iblock_property P
						,b_iblock_element_prop_m".$IBLOCK_ID." V
					WHERE ".$strWhere."
					AND E.IBLOCK_ID = ".$IBLOCK_ID."
					AND P.IBLOCK_ID = E.IBLOCK_ID
					AND P.PROPERTY_TYPE = 'F'
					AND V.IBLOCK_ELEMENT_ID = E.ID
					AND V.IBLOCK_PROPERTY_ID = P.ID
					AND V.VALUE_NUM = ".$FILE_ID."
				";
			}
			else
			{
				$strSQL = "
					SELECT COUNT(1) CNT
					FROM
						b_iblock_element E
						,b_iblock_property P
						,b_iblock_element_property V
					WHERE ".$strWhere."
					AND E.IBLOCK_ID = ".$IBLOCK_ID."
					AND P.IBLOCK_ID = E.IBLOCK_ID
					AND P.PROPERTY_TYPE = 'F'
					AND V.IBLOCK_ELEMENT_ID = E.ID
					AND V.IBLOCK_PROPERTY_ID = P.ID
					AND V.VALUE_NUM = ".$FILE_ID."
				";
			}
		}

		$rs = $DB->Query($strSQL);
		$ar = $rs->Fetch();

		$CNT += (int)$ar["CNT"];
		if($CNT > 0)
			return $CNT;

		//Check VERSION 2 SINGLE PROPERTIES
		if(!empty($arProps))
		{
			//This SQL potentially wrong
			//in case when file may be saved in
			//different properties
			$strSQL = "
				SELECT COUNT(1) CNT
				FROM
					b_iblock_element E
					,b_iblock_property P
					,b_iblock_element_prop_s".$IBLOCK_ID." V
				WHERE ".$strWhere."
				AND E.IBLOCK_ID = ".$IBLOCK_ID."
				AND P.IBLOCK_ID = E.IBLOCK_ID
				AND P.PROPERTY_TYPE = 'F'
				AND V.IBLOCK_ELEMENT_ID = E.ID
				AND (".implode(" OR ", $arProps).")
			";
			$rs = $DB->Query($strSQL);
			$ar = $rs->Fetch();
			$CNT += (int)$ar["CNT"];
			if($CNT > 0)
				return $CNT;
		}
	}

	if($bCheckOnly)
		return $CNT;
	elseif($CNT === 0)
		CFile::Delete($FILE_ID);
}