• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/comp_pricetools.php
  • Класс: CIBlockPriceTools
  • Вызов: CIBlockPriceTools::getTreePropertyValues
static function getTreePropertyValues(&$propList, &$propNeedValues)
{
	$result = array();
	if (!empty($propList) && is_array($propList))
	{
		$useFilterValues = !empty($propNeedValues) && is_array($propNeedValues);
		foreach ($propList as $oneProperty)
		{
			if (isset($oneProperty['DEFAULT_VALUES']['PICT']) && is_array($oneProperty['DEFAULT_VALUES']['PICT']))
			{
				if (!isset($oneProperty['DEFAULT_VALUES']['PICT']['ID']))
					$oneProperty['DEFAULT_VALUES']['PICT']['ID'] = 0;
			}
			$values = array();
			$valuesExist = false;
			$pictMode = ('PICT' == $oneProperty['SHOW_MODE']);
			$needValuesExist = !empty($propNeedValues[$oneProperty['ID']]) && is_array($propNeedValues[$oneProperty['ID']]);
			if ($useFilterValues && !$needValuesExist)
				continue;
			switch($oneProperty['PROPERTY_TYPE'])
			{
				case IblockPropertyTable::TYPE_LIST:
					if ($needValuesExist)
					{
						foreach (array_chunk($propNeedValues[$oneProperty['ID']], 500) as $pageIds)
						{
							$iterator = IblockPropertyEnumerationTable::getList(array(
								'select' => array('ID', 'VALUE', 'SORT'),
								'filter' => array('=PROPERTY_ID' => $oneProperty['ID'], '@ID' => $pageIds),
								'order' => array('SORT' => 'ASC', 'VALUE' => 'ASC')
							));
							while ($row = $iterator->fetch())
							{
								$row['ID'] = (int)$row['ID'];
								$values[$row['ID']] = array(
									'ID' => $row['ID'],
									'NAME' => $row['VALUE'],
									'SORT' => (int)$row['SORT'],
									'PICT' => false
								);
								$valuesExist = true;
							}
							unset($row, $iterator);
						}
						unset($pageIds);
					}
					else
					{
						$iterator = IblockPropertyEnumerationTable::getList(array(
							'select' => array('ID', 'VALUE', 'SORT'),
							'filter' => array('=PROPERTY_ID' => $oneProperty['ID']),
							'order' => array('SORT' => 'ASC', 'VALUE' => 'ASC')
						));
						while ($row = $iterator->fetch())
						{
							$row['ID'] = (int)$row['ID'];
							$values[$row['ID']] = array(
								'ID' => $row['ID'],
								'NAME' => $row['VALUE'],
								'SORT' => (int)$row['SORT'],
								'PICT' => false
							);
							$valuesExist = true;
						}
						unset($row, $iterator);
					}
					$values[0] = array(
						'ID' => 0,
						'SORT' => PHP_INT_MAX,
						'NA' => true,
						'NAME' => $oneProperty['DEFAULT_VALUES']['NAME'],
						'PICT' => $oneProperty['DEFAULT_VALUES']['PICT']
					);
					break;
				case IblockPropertyTable::TYPE_ELEMENT:
					$selectFields = array('ID', 'NAME');
					if ($pictMode)
						$selectFields[] = 'PREVIEW_PICTURE';

					if ($needValuesExist)
					{
						foreach (array_chunk($propNeedValues[$oneProperty['ID']], 500) as $pageIds)
						{
							$iterator =  CIBlockElement::GetList(
								array('SORT' => 'ASC', 'NAME' => 'ASC'),
								array('ID' => $pageIds, 'IBLOCK_ID' => $oneProperty['LINK_IBLOCK_ID'], 'ACTIVE' => 'Y'),
								false,
								false,
								$selectFields
							);
							while ($row = $iterator->Fetch())
							{
								if ($pictMode)
								{
									$row['PICT'] = false;
									if (!empty($row['PREVIEW_PICTURE']))
									{
										$previewPict = CFile::GetFileArray($row['PREVIEW_PICTURE']);
										if (!empty($previewPict))
										{
											$row['PICT'] = array(
												'ID' => (int)$previewPict['ID'],
												'SRC' => $previewPict['SRC'],
												'WIDTH' => (int)$previewPict['WIDTH'],
												'HEIGHT' => (int)$previewPict['HEIGHT']
											);
										}
									}
									if (empty($row['PICT']))
										$row['PICT'] = $oneProperty['DEFAULT_VALUES']['PICT'];
								}
								$row['ID'] = (int)$row['ID'];
								$values[$row['ID']] = array(
									'ID' => $row['ID'],
									'NAME' => $row['NAME'],
									'SORT' => (int)$row['SORT'],
									'PICT' => ($pictMode ? $row['PICT'] : false)
								);
								$valuesExist = true;
							}
							unset($row, $iterator);
						}
						unset($pageIds);
					}
					else
					{
						$iterator =  CIBlockElement::GetList(
							array('SORT' => 'ASC', 'NAME' => 'ASC'),
							array('IBLOCK_ID' => $oneProperty['LINK_IBLOCK_ID'], 'ACTIVE' => 'Y'),
							false,
							false,
							$selectFields
						);
						while ($row = $iterator->Fetch())
						{
							if ($pictMode)
							{
								$row['PICT'] = false;
								if (!empty($row['PREVIEW_PICTURE']))
								{
									$previewPict = CFile::GetFileArray($row['PREVIEW_PICTURE']);
									if (!empty($previewPict))
									{
										$row['PICT'] = array(
											'ID' => (int)$previewPict['ID'],
											'SRC' => $previewPict['SRC'],
											'WIDTH' => (int)$previewPict['WIDTH'],
											'HEIGHT' => (int)$previewPict['HEIGHT']
										);
									}
								}
								if (empty($row['PICT']))
									$row['PICT'] = $oneProperty['DEFAULT_VALUES']['PICT'];
							}
							$row['ID'] = (int)$row['ID'];
							$values[$row['ID']] = array(
								'ID' => $row['ID'],
								'NAME' => $row['NAME'],
								'SORT' => (int)$row['SORT'],
								'PICT' => ($pictMode ? $row['PICT'] : false)
							);
							$valuesExist = true;
						}
						unset($row, $iterator);
					}
					$values[0] = array(
						'ID' => 0,
						'SORT' => PHP_INT_MAX,
						'NA' => true,
						'NAME' => $oneProperty['DEFAULT_VALUES']['NAME'],
						'PICT' => ($pictMode ? $oneProperty['DEFAULT_VALUES']['PICT'] : false)
					);
					break;
				case IblockPropertyTable::TYPE_STRING:
					if (self::$highLoadInclude === null)
						self::$highLoadInclude = Loader::includeModule('highloadblock');
					if (!self::$highLoadInclude)
						continue 2;
					$xmlMap = array();
					$sortExist = isset($oneProperty['USER_TYPE_SETTINGS']['FIELDS_MAP']['UF_SORT']);

					$directorySelect = array('ID', 'UF_NAME', 'UF_XML_ID');
					$directoryOrder = array();
					if ($pictMode)
						$directorySelect[] = 'UF_FILE';
					if ($sortExist)
					{
						$directorySelect[] = 'UF_SORT';
						$directoryOrder['UF_SORT'] = 'ASC';
					}
					$directoryOrder['UF_NAME'] = 'ASC';
					$sortValue = 100;

					/** @var MainEntityBase $entity */
					$entity = $oneProperty['USER_TYPE_SETTINGS']['ENTITY'];
					if (!($entity instanceof MainEntityBase))
						continue 2;
					$entityDataClass = $entity->getDataClass();
					$entityGetList = array(
						'select' => $directorySelect,
						'order' => $directoryOrder
					);

					if ($needValuesExist)
					{
						foreach (array_chunk($propNeedValues[$oneProperty['ID']], 500) as $pageIds)
						{
							$entityGetList['filter'] = array('=UF_XML_ID' => $pageIds);
							$iterator = $entityDataClass::getList($entityGetList);
							while ($row = $iterator->fetch())
							{
								$row['ID'] = (int)$row['ID'];
								$row['UF_SORT'] = ($sortExist ? (int)$row['UF_SORT'] : $sortValue);
								$sortValue += 100;

								if ($pictMode)
								{
									if (!empty($row['UF_FILE']))
									{
										$arFile = CFile::GetFileArray($row['UF_FILE']);
										if (!empty($arFile))
										{
											$row['PICT'] = array(
												'ID' => (int)$arFile['ID'],
												'SRC' => $arFile['SRC'],
												'WIDTH' => (int)$arFile['WIDTH'],
												'HEIGHT' => (int)$arFile['HEIGHT']
											);
										}
									}
									if (empty($row['PICT']))
										$row['PICT'] = $oneProperty['DEFAULT_VALUES']['PICT'];
								}
								$values[$row['ID']] = array(
									'ID' => $row['ID'],
									'NAME' => $row['UF_NAME'],
									'SORT' => (int)$row['UF_SORT'],
									'XML_ID' => $row['UF_XML_ID'],
									'PICT' => ($pictMode ? $row['PICT'] : false)
								);
								$valuesExist = true;
								$xmlMap[$row['UF_XML_ID']] = $row['ID'];
							}
							unset($row, $iterator);
						}
						unset($pageIds);
					}
					else
					{
						$iterator = $entityDataClass::getList($entityGetList);
						while ($row = $iterator->fetch())
						{
							$row['ID'] = (int)$row['ID'];
							$row['UF_SORT'] = ($sortExist ? (int)$row['UF_SORT'] : $sortValue);
							$sortValue += 100;

							if ($pictMode)
							{
								if (!empty($row['UF_FILE']))
								{
									$arFile = CFile::GetFileArray($row['UF_FILE']);
									if (!empty($arFile))
									{
										$row['PICT'] = array(
											'ID' => (int)$arFile['ID'],
											'SRC' => $arFile['SRC'],
											'WIDTH' => (int)$arFile['WIDTH'],
											'HEIGHT' => (int)$arFile['HEIGHT']
										);
									}
								}
								if (empty($row['PICT']))
									$row['PICT'] = $oneProperty['DEFAULT_VALUES']['PICT'];
							}
							$values[$row['ID']] = array(
								'ID' => $row['ID'],
								'NAME' => $row['UF_NAME'],
								'SORT' => (int)$row['UF_SORT'],
								'XML_ID' => $row['UF_XML_ID'],
								'PICT' => ($pictMode ? $row['PICT'] : false)
							);
							$valuesExist = true;
							$xmlMap[$row['UF_XML_ID']] = $row['ID'];
						}
						unset($row, $iterator);
					}
					$values[0] = array(
						'ID' => 0,
						'SORT' => PHP_INT_MAX,
						'NA' => true,
						'NAME' => $oneProperty['DEFAULT_VALUES']['NAME'],
						'XML_ID' => '',
						'PICT' => ($pictMode ? $oneProperty['DEFAULT_VALUES']['PICT'] : false)
					);
					if ($valuesExist)
						$oneProperty['XML_MAP'] = $xmlMap;
				break;
			}
			if (!$valuesExist)
				continue;
			$oneProperty['VALUES'] = $values;
			$oneProperty['VALUES_COUNT'] = count($values);

			$result[$oneProperty['CODE']] = $oneProperty;
		}
	}
	$propList = $result;
	unset($arFilterProp);
}