• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/comp_pricetools.php
  • Класс: CIBlockPriceTools
  • Вызов: CIBlockPriceTools::getTreeProperties
static function getTreeProperties($skuInfo, $propertiesCodes, $defaultFields = array())
{
	if (isset($defaultFields['PICT']) && is_array($defaultFields['PICT']))
	{
		if (!isset($defaultFields['PICT']['ID']))
			$defaultFields['PICT']['ID'] = 0;
	}

	$requireFields = array(
		'ID',
		'UF_XML_ID',
		'UF_NAME',
	);

	$result = array();
	if (empty($skuInfo))
		return $result;
	if (!is_array($skuInfo))
	{
		$skuInfo = (int)$skuInfo;
		if ($skuInfo <= 0)
			return $result;
		if (self::$catalogIncluded === null)
			self::$catalogIncluded = Loader::includeModule('catalog');
		if (!self::$catalogIncluded)
			return $result;
		$skuInfo = CCatalogSku::GetInfoByProductIBlock($skuInfo);
		if (empty($skuInfo))
			return $result;
	}
	if (empty($propertiesCodes) || !is_array($propertiesCodes))
		return $result;

	$showMode = '';

	$propertyIterator = IblockPropertyTable::getList(array(
		'select' => array(
			'ID', 'IBLOCK_ID', 'CODE', 'NAME', 'SORT', 'LINK_IBLOCK_ID', 'PROPERTY_TYPE', 'USER_TYPE', 'USER_TYPE_SETTINGS'
		),
		'filter' => array(
			'=IBLOCK_ID' => $skuInfo['IBLOCK_ID'],
			'=PROPERTY_TYPE' => array(
				IblockPropertyTable::TYPE_LIST,
				IblockPropertyTable::TYPE_ELEMENT,
				IblockPropertyTable::TYPE_STRING
			),
			'=ACTIVE' => 'Y', '=MULTIPLE' => 'N'
		),
		'order' => array(
			'SORT' => 'ASC', 'ID' => 'ASC'
		)
	));
	while ($propInfo = $propertyIterator->fetch())
	{
		$propInfo['ID'] = (int)$propInfo['ID'];
		if ($propInfo['ID'] == $skuInfo['SKU_PROPERTY_ID'])
			continue;
		$propInfo['CODE'] = (string)$propInfo['CODE'];
		if ($propInfo['CODE'] === '')
			$propInfo['CODE'] = $propInfo['ID'];
		if (!in_array($propInfo['CODE'], $propertiesCodes))
			continue;
		$propInfo['SORT'] = (int)$propInfo['SORT'];
		$propInfo['USER_TYPE'] = (string)$propInfo['USER_TYPE'];
		if ($propInfo['PROPERTY_TYPE'] == IblockPropertyTable::TYPE_STRING)
		{
			if ('directory' != $propInfo['USER_TYPE'])
				continue;
			$propInfo['USER_TYPE_SETTINGS'] = (string)$propInfo['USER_TYPE_SETTINGS'];
			if ($propInfo['USER_TYPE_SETTINGS'] == '')
				continue;
			$propInfo['USER_TYPE_SETTINGS'] = unserialize($propInfo['USER_TYPE_SETTINGS'], ['allowed_classes' => false]);
			if (!isset($propInfo['USER_TYPE_SETTINGS']['TABLE_NAME']) || empty($propInfo['USER_TYPE_SETTINGS']['TABLE_NAME']))
				continue;
			if (self::$highLoadInclude === null)
				self::$highLoadInclude = Loader::includeModule('highloadblock');
			if (!self::$highLoadInclude)
				continue;

			$highBlock = HighloadBlockTable::getList(array(
				'filter' => array('=TABLE_NAME' => $propInfo['USER_TYPE_SETTINGS']['TABLE_NAME'])
			))->fetch();
			if (!isset($highBlock['ID']))
				continue;

			$entity = HighloadBlockTable::compileEntity($highBlock);
			$fieldsList = $entity->getFields();
			if (empty($fieldsList))
				continue;

			$flag = true;
			foreach ($requireFields as $fieldCode)
			{
				if (!isset($fieldsList[$fieldCode]) || empty($fieldsList[$fieldCode]))
				{
					$flag = false;
					break;
				}
			}
			unset($fieldCode);
			if (!$flag)
				continue;
			$propInfo['USER_TYPE_SETTINGS']['FIELDS_MAP'] = $fieldsList;
			$propInfo['USER_TYPE_SETTINGS']['ENTITY'] = $entity;
		}
		switch ($propInfo['PROPERTY_TYPE'])
		{
			case IblockPropertyTable::TYPE_ELEMENT:
				$showMode = 'PICT';
				break;
			case IblockPropertyTable::TYPE_LIST:
				$showMode = 'TEXT';
				break;
			case IblockPropertyTable::TYPE_STRING:
				$showMode = (isset($fieldsList['UF_FILE']) ? 'PICT' : 'TEXT');
				break;
		}
		$treeProp = array(
			'ID' => $propInfo['ID'],
			'CODE' => $propInfo['CODE'],
			'NAME' => $propInfo['NAME'],
			'SORT' => $propInfo['SORT'],
			'PROPERTY_TYPE' => $propInfo['PROPERTY_TYPE'],
			'USER_TYPE' => $propInfo['USER_TYPE'],
			'LINK_IBLOCK_ID' => $propInfo['LINK_IBLOCK_ID'],
			'USER_TYPE_SETTINGS' => $propInfo['USER_TYPE_SETTINGS'],
			'VALUES' => array(),
			'SHOW_MODE' => $showMode,
			'DEFAULT_VALUES' => array(
				'PICT' => false,
				'NAME' => '-'
			)
		);
		if ($showMode == 'PICT')
		{
			if (isset($defaultFields['PICT']))
				$treeProp['DEFAULT_VALUES']['PICT'] = $defaultFields['PICT'];
		}
		if (isset($defaultFields['NAME']))
		{
			$treeProp['DEFAULT_VALUES']['NAME'] = $defaultFields['NAME'];
		}
		$result[$treeProp['CODE']] = $treeProp;
	}
	return $result;
}