• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/v2/AgentContract/Manager.php
  • Класс: BitrixCatalogv2AgentContractManager
  • Вызов: Manager::saveFiles
static function saveFiles(int $contractId, array $files): void
{
	if (empty($files))
	{
		return;
	}

	// load current file list
	$existingFiles = [];
	$fileMap = [];
	$agentContractFileIterator = CatalogAgentContractFileTable::getList([
		'select' => ['ID', 'FILE_ID'],
		'filter' => ['=CONTRACT_ID' => $contractId],
	]);
	while ($agentContractFile = $agentContractFileIterator->fetch())
	{
		$id = (int)$agentContractFile['ID'];
		$fileId = (int)$agentContractFile['FILE_ID'];
		$existingFiles[$id] = [
			'ID' => $id,
			'FILE_ID' => $fileId,
		];
		$fileMap[$fileId] = $id;
	}

	// convert the new list of files to array format for each line if needed
	$files = static::convertFileList($fileMap, $files);
	if (empty($files))
	{
		return;
	}

	// checking that the passed set of document files is full
	foreach (array_keys($existingFiles) as $rowId)
	{
		if (!isset($files[$rowId]))
		{
			$files[$rowId] = $existingFiles[$rowId];
		}
	}

	// process file list
	$parsed = [];
	foreach ($files as $rowId => $row)
	{
		// replace or delete existing file
		if (
			is_int($rowId)
			&& is_array($row)
			&& isset($existingFiles[$rowId])
		)
		{
			// delete file
			if (
				isset($row['DEL'])
				&& $row['DEL'] === 'Y'
			)
			{
				$resultInternal = CatalogAgentContractFileTable::delete($rowId);
				if ($resultInternal->isSuccess())
				{
					CFile::Delete($existingFiles[$rowId]['FILE_ID']);
				}
			}
			// replace file
			elseif (
				isset($row['FILE_ID'])
			)
			{
				if ($row['FILE_ID'] !== $existingFiles[$rowId]['FILE_ID'])
				{
					$resultInternal = CatalogAgentContractFileTable::update(
						$rowId,
						[
							'FILE_ID' => $row['FILE_ID'],
						]
					);
					if ($resultInternal->isSuccess())
					{
						CFile::Delete($existingFiles[$rowId]['FILE_ID']);
					}
				}
			}
		}
		// save new file
		elseif (
			preg_match('/^n[0-9]+$/', $rowId, $parsed)
			&& is_array($row)
		)
		{
			// file already saved from external code
			if (isset($row['FILE_ID']))
			{
				$resultInternal = CatalogAgentContractFileTable::add([
					'CONTRACT_ID' => $contractId,
					'FILE_ID' => $row['FILE_ID'],
				]);
				if ($resultInternal->isSuccess())
				{
					$id = (int)$resultInternal->getId();
					$fileMap[$row['FILE_ID']] = $id;
					$existingFiles[$id] = [
						'ID' => $id,
						'FILE_ID' => $row['FILE_ID'],
					];
				}
			}
			// save uploaded file
			elseif (
				isset($row['FILE_UPLOAD'])
				&& is_array($row['FILE_UPLOAD'])
			)
			{
				$row['FILE_UPLOAD']['MODULE_ID'] = 'catalog';
				$fileId = (int)CFile::SaveFile(
					$row['FILE_UPLOAD'],
					'catalog',
					false,
					true
				);
				if ($fileId > 0)
				{
					$resultInternal = CatalogAgentContractFileTable::add([
						'CONTRACT_ID' => $contractId,
						'FILE_ID' => $fileId,
					]);
					if ($resultInternal->isSuccess())
					{
						$id = (int)$resultInternal->getId();
						$fileMap[$fileId] = $id;
						$existingFiles[$id] = [
							'ID' => $id,
							'FILE_ID' => $fileId,
						];
					}
				}
			}
		}
	}
}