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