-
Роман ЦукановРазработчик
-
Дата публикации07.02.2020
-
Категория1С-Битрикс
Ситуация тривиальна. Прошла выгрузка, часть элементов инфоблока была удалена, но прикрепленные к данным элементам файлы так и остаются на сервере без определенного места жительства, но с занимаемой территорией (местом на FTP).
Одно дело просто удалить элемент и совсем другое удалить элемент вместе с прикрепленными к нему файлами. Речь идет, например, о картинках для анонса и картинках для подробного просмотра, различных свойствах с типом «файл» (галерея, прикрепленные инструкции, видео и т.д.).
Для начала создадим функцию, которая будет удалять файлы картинки для анонса и детальной картинки. К сожалению, через API этого не сделать, поэтому придется лезть в БД.
function deleteFileFromFtpAndDatabase($fileId)
{
global $DB;
$result = $DB->Query('SELECT FILE_NAME, SUBDIR FROM b_file WHERE MODULE_ID = "iblock" AND ID = '. $fileId);
if ($row = $result->Fetch()) {
$fileDir = $row['SUBDIR'];
$fileName = $row['FILE_NAME'];
}
$path = $_SERVER['DOCUMENT_ROOT'] . "/upload/" . $fileDir . '/' . $fileName;
$hRootDir = opendir($path);
unlink($path);
$result = $DB->Query('DELETE FROM b_file WHERE ID = '. $fileId);
}
Далее приступим к написанию самого скрипта. Для начала необходимый минимум.
define('STOP_STATISTICS', true);
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
Теперь получим необходимые нам товары/элементы.
$date = date('Y.m.d H:i:s', strtotime(Date('Y-m-d',time()). ' - 90 days'));
$arSelect = Array("ID", "TIMESTAMP_X", "NAME", "QUANTITY", "PREVIEW_PICTURE", "DETAIL_PICTURE");
$arFilter = Array("IBLOCK_ID"=>18, "ACTIVE"=>"Y","=QUANTITY"=>0, "<=TIMESTAMP_X"=>$date);
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->Fetch())
{
$oldProducts[] = $ob;
}
После получения массива, пробежимся по нему и удалим файлы, ну и за компанию сам элемент инфоблока.
foreach ($oldProducts as $oldProduct) {
if(!empty($oldProduct['DETAIL_PICTURE'])) {
deleteFileFromFtpAndDatabase($oldProduct['DETAIL_PICTURE']);
}
if(!empty($oldProduct['PREVIEW_PICTURE'])) {
deleteFileFromFtpAndDatabase($oldProduct['PREVIEW_PICTURE']);
}
$arFilter = array(
'IBLOCK_ID' => 18,
'PROPERTY_TYPE' => 'F'
);
CIBlockElement::Delete($oldProduct['ID']);
}
Для идеального завершения задачи останется только дописать удаление файлов из свойств типа «файл».