• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/v2/AgentContract/Manager.php
  • Класс: BitrixCatalogv2AgentContractManager
  • Вызов: Manager::get
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;
}