- Модуль: 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);
}