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