Skip to content

Instantly share code, notes, and snippets.

@theStrangeAdventurer
Last active July 31, 2019 07:04
Show Gist options
  • Save theStrangeAdventurer/a406bfab077f726405c661088bf26f9c to your computer and use it in GitHub Desktop.
Save theStrangeAdventurer/a406bfab077f726405c661088bf26f9c to your computer and use it in GitHub Desktop.
БИТРИКС: Очистка файлов в папке upload - Выборка используемых файлов В элементах выбранных инфоблоках а также в выбранных свойствах этих элементов.
<?php require( $_SERVER[ "DOCUMENT_ROOT" ] . "/bitrix/modules/main/include/prolog_before.php" );
use Bitrix\Main\Loader;
/**
* Вернет массив файлов в директории, для любой вложенности
*
* @param $dir
* @param array $results
* @return array
*/
function getDirContents($dir, &$results = array()) {
$files = scandir($dir);
foreach($files as $key => $value){
$path = realpath($dir.DIRECTORY_SEPARATOR.$value);
if(!is_dir($path)) {
$results[] = $path;
} else if($value != "." && $value != "..") {
getDirContents($path, $results);
if (is_file($path))
$results[] = $path;
}
}
return $results;
}
$uploadFolder = $_SERVER['DOCUMENT_ROOT'] . '/upload'; // Указываем путь к папке upload
$excludeFromDelete = [ // массив файлов и директорий внутри upload, которые мы исключаем из спика удаляемых
'.htaccess',
'currencyRates.json',
'uf',
];
$dirToRemoveFiles = array_filter( scandir($uploadFolder), function ($el) use ($excludeFromDelete) {
if (!in_array($el, $excludeFromDelete) && ( $el !== '.' ) && ( $el !== '..' ))
return true;
else
return false;
} );
$allFilesInUploadFolder = []; // массив всех ссылок на файлы (в папке upload)
foreach ($dirToRemoveFiles as $dir) { // Заполняем массив файлов внутри upload, за исключением $excludeFromDelete
$fullDir = $uploadFolder . '/' . $dir;
if (is_dir($fullDir))
getDirContents($fullDir, $allFilesInUploadFolder);
}
$needIblockIds = [ // Массив с идентификаторми инфоблоков, в данном случае используются константы
SERVICES_IBLOCK_ID,
NEWS_IBLOCK_ID,
PRESS_IBLOCK_ID,
REALTY_OBJECTS_IBLOCK_ID,
NEW_BUILDINGS_IBLOCK_ID,
];
$properties = [ // массив свойств элементов инфоблока типа файл, ссылки на которые необходимо сохранить
"LAZY_LOAD" => [
'multiple' => false // если свойство множественное ставим true
],
"SERVICE_ICON" => [
'multiple' => false
],
"photos" => [
'multiple' => true
],
"plans" => [
'multiple' => true
],
];
$usedFilesPathes = []; // массив используемых в проекте ссылок на файлы (в папке upload)
if (!Loader::includeModule('iblock'))
return;
$cibElemsRes = CIBlockElement::GetList( // элементы всех инфоблоков которые нам нужны
[ "SORT"=>"ASC" ],
[
"IBLOCK_ID" => $needIblockIds,
"ACTIVE" => 'Y'
]
);
while ($elem = $cibElemsRes->GetNextElement()) {
if($elem->fields['PREVIEW_PICTURE']) // Добавляем в массив картинку превью и детальную для все элементов если существует
$usedFilesPathes[] = $_SERVER['DOCUMENT_ROOT'] . CFile::GetPath($elem->fields['PREVIEW_PICTURE']);
if($elem->fields['DETAIL_PICTURE'])
$usedFilesPathes[] = $_SERVER['DOCUMENT_ROOT'] . CFile::GetPath($elem->fields['DETAIL_PICTURE']);
$props = $elem->GetProperties();
if (!$props)
continue;
foreach ($props as $propName => $propArr) { // если свойства не пустые , то проходимся по ним и закидываем в массив необходимые ссылки на файлы
if (!$properties[$propName])
continue;
if (!$properties[$propName]['multiple']) { // если не множественное
if ($propArr['VALUE']) {
$usedFilesPathes[] = $_SERVER['DOCUMENT_ROOT'] . CFile::GetPath($propArr['VALUE']);
}
} else {
foreach ($propArr['VALUE'] as $id) { // если множественное
$usedFilesPathes[] = $_SERVER['DOCUMENT_ROOT'] . CFile::GetPath($id);
}
}
}
}
$matches = 0;
foreach ($allFilesInUploadFolder as $_FILE) { // Проходим по массиву со всеми файлами и удаляем неиспользуемые
if (in_array($_FILE, $usedFilesPathes))
$matches++;
else
unlink($_FILE);
}
@theStrangeAdventurer
Copy link
Author

Создаем директорию в корне сайта, а в ней файл index.php, туда вставляем содержимое, обращаемся в браузере http://your-site.com/<директория>/
Когда скрипт отработает, удалятся все неиспользуемые файлы. Необходимо правильно указать все свойства инфоблоков с типом файл и указать их символьные коды в массиве $properties, а также указать все необходимые ID инфоблоков в массиве $needIblockIds

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment