-
-
Save theStrangeAdventurer/a406bfab077f726405c661088bf26f9c to your computer and use it in GitHub Desktop.
БИТРИКС: Очистка файлов в папке upload - Выборка используемых файлов В элементах выбранных инфоблоках а также в выбранных свойствах этих элементов.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Создаем директорию в корне сайта, а в ней файл index.php, туда вставляем содержимое, обращаемся в браузере http://your-site.com/<директория>/
Когда скрипт отработает, удалятся все неиспользуемые файлы. Необходимо правильно указать все свойства инфоблоков с типом файл и указать их символьные коды в массиве $properties, а также указать все необходимые ID инфоблоков в массиве $needIblockIds