- Модуль: sender
- Путь к файлу: ~/bitrix/modules/sender/lib/filetable.php
- Класс: Bitrix\Sender\FileTable
- Вызов: FileTable::syncFiles
static function syncFiles(int $entityId, int $entityType, string $template, bool $deleteFiles = true, bool $onDeleteEntity = false)
{
preg_match_all(
'@src="([^"]+)"@',
$template,
$matches
);
$urls = array_pop($matches);
// get file list from html
$fileNameList = [];
$fileNameSearchList = [];
$files = [];
foreach ($urls as $path)
{
preg_match("/[^\/|\\\]+$/", $path, $url);
if (!$url)
{
continue;
}
if (!empty($url[0]))
{
$fileNameList[] = $url[0];
if (array_key_exists($url[0], static::$fileList))
{
$files[] = static::$fileList[$url[0]];
continue;
}
$fileNameSearchList[] = $url[0];
}
}
if (!empty($fileNameSearchList))
{
// get files from main FileTable which exists in html
$selectedFiles = \Bitrix\Main\FileTable::getList([
'select' => ['ID', 'FILE_NAME'],
'filter' => [
'=MODULE_ID' => 'sender',
'@FILE_NAME' => $fileNameSearchList,
],
'order' => [
'ID' => 'ASC'
]
])->fetchAll();
$files = array_merge($files, $selectedFiles);
if (empty($selectedFiles))
{
foreach ($fileNameList as $fileName)
{
static::$fileList[$fileName] = null;
}
}
}
$batchData = [];
// get files in current sender file table
$currentFiles = array_column(self::getCurrentFiles($entityId, $entityType), 'FILE_ID');
$preparedFiles = [];
foreach ($currentFiles as $fileId)
{
$preparedFiles[$fileId] = $fileId;
}
$filesToDelete = [];
foreach ($files as $file)
{
if (is_null($file))
{
continue;
}
if (!isset(static::$fileList[$file['FILE_NAME']]))
{
static::$fileList[$file['FILE_NAME']] = $file;
}
if ($onDeleteEntity && in_array($file['ID'], $preparedFiles))
{
$filesToDelete[] = $file['ID'];
unset($preparedFiles[$file['ID']]);
continue;
}
// do nothing if file in current template
if (in_array($file['ID'], $preparedFiles))
{
unset($preparedFiles[$file['ID']]);
continue;
}
if (isset($batchData[$file['FILE_NAME']]))
{
$filesToDelete[] = $file['ID'];
continue;
}
foreach ($fileNameList as $fileName)
{
if ($fileName === $file['FILE_NAME'])
{
$batchData[$fileName] = [
'ENTITY_TYPE' => $entityType,
'ENTITY_ID' => $entityId,
'FILE_ID' => $file['ID'],
'DATE_INSERT' => new MainType\DateTime()
];
}
}
}
foreach ($preparedFiles as $file)
{
self::deleteIfCan($file, $entityId, $entityType, $deleteFiles);
}
foreach ($filesToDelete as $file)
{
self::deleteIfCan($file, $entityId, $entityType, $deleteFiles);
}
SqlBatch::insert(self::getTableName(), $batchData, ['FILE_ID']);
}