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);
}