static function get(int $id): MainResult
{
$result = new MainResult();
$agentContract = CatalogAgentContractTable::getList([
'select' => [
'ID',
'TITLE',
'CONTRACTOR_ID',
'DATE_MODIFY',
'DATE_CREATE',
'MODIFIED_BY',
'CREATED_BY',
],
'filter' => ['=ID' => $id],
'limit' => 1
])->fetch();
if ($agentContract)
{
$products = [];
$productsIds = [];
$sectionIds = [];
$agentProductIterator = CatalogAgentProductTable::getList([
'select' => [
'ID',
'PRODUCT_ID',
'PRODUCT_TYPE',
],
'filter' => [
'=CONTRACT_ID' => $id,
],
]);
while ($agentProduct = $agentProductIterator->fetch())
{
if ($agentProduct['PRODUCT_TYPE'] === CatalogAgentProductTable::PRODUCT_TYPE_SECTION)
{
$sectionIds[] = $agentProduct['PRODUCT_ID'];
}
if ($agentProduct['PRODUCT_TYPE'] === CatalogAgentProductTable::PRODUCT_TYPE_PRODUCT)
{
$productsIds[] = $agentProduct['PRODUCT_ID'];
}
$agentProduct['PRODUCT_NAME'] = '';
$products[] = $agentProduct;
}
if ($products)
{
$sectionNames = [];
$productNames = [];
$sectionImages = [];
if ($sectionIds)
{
$sectionIterator = IblockSectionTable::getList([
'select' => ['ID', 'NAME', 'PICTURE'],
'filter' => ['=ID' => array_unique($sectionIds)],
]);
while ($sectionData = $sectionIterator->fetch())
{
$sectionNames[$sectionData['ID']] = $sectionData['NAME'];
if (!empty($sectionData['PICTURE']))
{
$sectionImages[$sectionData['ID']] = self::getImageSource((int)$sectionData['PICTURE']);
}
}
}
$productImages = [];
$iblockProductMorePhotoMap = [];
if ($productsIds)
{
$elementIterator = IblockElementTable::getList([
'select' => ['ID', 'NAME', 'IBLOCK_ID', 'PREVIEW_PICTURE', 'DETAIL_PICTURE'],
'filter' => ['=ID' => array_unique($productsIds)],
]);
while ($elementData = $elementIterator->fetch())
{
$elementId = $elementData['ID'];
$productNames[$elementId] = $elementData['NAME'];
if (!empty($elementData['PREVIEW_PICTURE']))
{
$productImages[$elementId] = self::getImageSource((int)$elementData['PREVIEW_PICTURE']);
}
if (empty($element['IMAGE']) && !empty($elementData['DETAIL_PICTURE']))
{
$productImages[$elementId] = self::getImageSource((int)$elementData['DETAIL_PICTURE']);
}
if (empty($element['IMAGE']))
{
$iblockProductMorePhotoMap[$elementData['IBLOCK_ID']] ??= [];
$iblockProductMorePhotoMap[$elementData['IBLOCK_ID']][] = $elementId;
}
}
if (!empty($iblockProductMorePhotoMap))
{
$morePhotoIds = [];
$iterator = PropertyTable::getList([
'select' => ['ID', 'IBLOCK_ID'],
'filter' => [
'=IBLOCK_ID' => array_keys($iblockProductMorePhotoMap),
'=CODE' => CIBlockPropertyTools::CODE_MORE_PHOTO,
'=ACTIVE' => 'Y',
],
]);
if ($row = $iterator->fetch())
{
$morePhotoIds[$row['IBLOCK_ID']] = $row['ID'];
}
foreach ($morePhotoIds as $iblockId => $propertyId)
{
$elementIds = $iblockProductMorePhotoMap[$iblockId];
$elementPropertyValues = array_fill_keys($elementIds, []);
$offersFilter = [
'IBLOCK_ID' => $iblockId,
'ID' => $elementIds,
];
$propertyFilter = [
'ID' => $propertyId,
];
CIBlockElement::GetPropertyValuesArray($elementPropertyValues, $iblockId, $offersFilter, $propertyFilter);
foreach ($elementPropertyValues as $productId => $properties)
{
if (empty($properties))
{
continue;
}
$morePhotoProperty = reset($properties);
$value = $morePhotoProperty['VALUE'] ?? null;
if (empty($value))
{
continue;
}
$propertyValue = is_array($value) ? reset($value) : $value['VALUE'];
if ((int)$propertyValue > 0)
{
$productImages[$productId] = self::getImageSource((int)$propertyValue);
}
}
}
}
}
$products = array_map(
static function ($product) use ($sectionNames, $productNames, $productImages, $sectionImages)
{
if ($product['PRODUCT_TYPE'] === CatalogAgentProductTable::PRODUCT_TYPE_SECTION)
{
$product['PRODUCT_NAME'] = $sectionNames[$product['PRODUCT_ID']];
$product['IMAGE'] = $sectionImages[$product['PRODUCT_ID']] ?? null;
}
if ($product['PRODUCT_TYPE'] === CatalogAgentProductTable::PRODUCT_TYPE_PRODUCT)
{
$product['PRODUCT_NAME'] = $productNames[$product['PRODUCT_ID']];
$product['IMAGE'] = $productImages[$product['PRODUCT_ID']] ?? null;
}
return $product;
},
$products
);
}
$files = self::getFiles($id);
$result->setData(
array_merge(
$agentContract,
[
'PRODUCTS' => $products,
'FILES' => $files,
]
)
);
}
return $result;
}