protected function getAdditionalValues(array $values, array $descriptions = []): array
{
$additionalValues = [];
foreach ($descriptions as $description)
{
if (!isset($description['type']) || !in_array($description['type'], ['custom', 'money', 'multimoney', 'user'], true))
{
continue;
}
$value = $values[$description['name']] ?? null;
$descriptionData = $description['data'] ?? [];
if (!empty($description['settings']['USER_TYPE']))
{
$description['settings']['PROPERTY_USER_TYPE'] = CIBlockProperty::GetUserType(
$description['settings']['USER_TYPE']
);
}
$propertySettings = $description['settings'] ?? [];
if ($description['type'] === 'custom')
{
if ($this->isCustomLinkProperty($propertySettings))
{
$params = [
'SETTINGS' => $propertySettings,
'VALUE' => $value,
'FIELD_NAME' => $description['name'],
'ELEMENT_ID' => $this->entity->getId() ? (string)$this->entity->getId() : 'n' . mt_rand(),
];
$paramsSingle = $params;
$paramsSingle['SETTINGS']['MULTIPLE'] = 'N';
$paramsMultiple = $params;
$paramsMultiple['SETTINGS']['MULTIPLE'] = 'Y';
$viewMethod = $propertySettings['PROPERTY_USER_TYPE'][self::USER_TYPE_GET_VIEW_METHOD] ?? null;
if ($viewMethod && is_callable($viewMethod))
{
$additionalValues[$descriptionData['view']] = $viewMethod($params);
}
$editMethod = $propertySettings['PROPERTY_USER_TYPE'][self::USER_TYPE_GET_EDIT_METHOD] ?? null;
if ($editMethod && is_callable($editMethod))
{
$additionalValues[$descriptionData['edit']] = $editMethod($params);
$additionalValues[$descriptionData['editList']]['SINGLE'] = $editMethod($paramsSingle);
$additionalValues[$descriptionData['editList']]['MULTIPLE'] = $editMethod($paramsMultiple);
}
}
elseif ($propertySettings['PROPERTY_TYPE'] === PropertyTable::TYPE_ELEMENT)
{
$elementData = ElementTable::getList([
'select' => ['NAME'],
'filter' => ['ID' => $value],
]);
$namesList = [];
while ($element = $elementData->fetch())
{
$namesList[] = $element['NAME'];
}
$viewValue = implode(', ', $namesList);
$additionalValues[$descriptionData['view']] = HtmlFilter::encode($viewValue);
$editMethod = ['CIBlockPropertyElementAutoComplete', 'GetUIEntityEditorPropertyEditHtml'];
if (is_callable($editMethod))
{
$params = [
'SETTINGS' => $propertySettings,
'VALUE' => $value,
'FIELD_NAME' => $description['name'],
];
$paramsSingle = $params;
$paramsSingle['SETTINGS']['MULTIPLE'] = 'N';
$paramsMultiple = $params;
$paramsMultiple['SETTINGS']['MULTIPLE'] = 'Y';
$additionalValues[$descriptionData['edit']] = $editMethod($params);
$additionalValues[$descriptionData['editList']]['SINGLE'] = $editMethod($paramsSingle);
$additionalValues[$descriptionData['editList']]['MULTIPLE'] = $editMethod($paramsMultiple);
}
else
{
$additionalValues[$descriptionData['edit']] = $this->getElementPropertyEditHtml(
$description['name'],
$propertySettings,
$value
);
}
}
elseif ($propertySettings['PROPERTY_TYPE'] === PropertyTable::TYPE_FILE)
{
if ($description['propertyCode'] === self::MORE_PHOTO)
{
$value = $this->getEntityViewPictureValues($this->entity);
$editValue = $this->getEntityEditPictureValues($this->entity);
if (!$description['multiple'])
{
$value = $value[0];
$editValue = $editValue[0];
}
}
else
{
$editValue = $value;
}
$isImageInput = $this->isImageProperty($description['settings']);
$descriptionSingle = $description;
$descriptionSingle['settings']['MULTIPLE'] = false;
$descriptionMultiple = $description;
$descriptionMultiple['settings']['MULTIPLE'] = true;
if ($isImageInput)
{
$additionalValues[$descriptionData['view']] = $this->getImagePropertyViewHtml($value);
$additionalValues[$descriptionData['viewList']]['SINGLE'] = $this->getImagePropertyViewHtml(is_array($value) ? $value[0] ?? null : $value);
$additionalValues[$descriptionData['viewList']]['MULTIPLE'] = $this->getImagePropertyViewHtml(is_array($value) ? $value : [$value]);
$additionalValues[$descriptionData['edit']] = $this->getImagePropertyEditHtml($description, $editValue);
$additionalValues[$descriptionData['editList']]['SINGLE'] = $this->getImagePropertyEditHtml($descriptionSingle, is_array($editValue) ? $editValue[0] ?? null : $editValue);
$additionalValues[$descriptionData['editList']]['MULTIPLE'] = $this->getImagePropertyEditHtml($descriptionMultiple, is_array($editValue) ? $editValue : [$editValue]);
}
else
{
// generate new IDs for new elements to avoid duplicate IDs in HTML inputs
$entityId = $this->entity->getId() ?? uniqid();
$controlId = $description['name'] . '_uploader_' . $entityId;
$additionalValues[$descriptionData['view']] = '';
$additionalValues[$descriptionData['viewList']]['SINGLE'] = '';
$additionalValues[$descriptionData['viewList']]['MULTIPLE'] = '';
if (!empty($value))
{
$additionalValues[$descriptionData['view']] = $this->getFilePropertyViewHtml($description, $value, $controlId);
$additionalValues[$descriptionData['viewList']]['SINGLE'] = $this->getFilePropertyViewHtml($description, is_array($value) ? $value[0] ?? null : $value, $controlId, false);
$additionalValues[$descriptionData['viewList']]['MULTIPLE'] = $this->getFilePropertyViewHtml($description, is_array($value) ? $value : [$value], $controlId, true);
}
$additionalValues[$descriptionData['edit']] = $this->getFilePropertyEditHtml($description, $value, $controlId);
$additionalValues[$descriptionData['editList']]['SINGLE'] = $this->getFilePropertyEditHtml($description, is_array($value) ? $value[0] ?? null : $value, $controlId, false);
$additionalValues[$descriptionData['editList']]['MULTIPLE'] = $this->getFilePropertyEditHtml($description, is_array($value) ? $value : [$value], $controlId, true);
}
}
else
{
if (
$propertySettings['USER_TYPE'] === 'FileMan'
|| $propertySettings['USER_TYPE'] === 'DiskFile'
)
{
$value = [
'VALUE' => null,
'DESCRIPTION' => '',
];
}
$params = [
'SETTINGS' => $propertySettings,
'VALUE' => $value,
'FIELD_NAME' => $description['name'],
'ELEMENT_ID' => $this->entity->getId() ? (string)$this->entity->getId() : 'n' . mt_rand(),
];
if ($propertySettings['USER_TYPE'] === 'map_google')
{
$params['WIDTH'] = '95%';
$params['HEIGHT'] = '400px';
}
$paramsSingle = $params;
if ($description['multiple'])
{
$paramsSingle['VALUE'] = $value[0] ?? '';
}
else
{
$paramsSingle['VALUE'] = $value;
}
$paramsSingle['SETTINGS']['MULTIPLE'] = 'N';
if ($value === '')
{
$singleValueToMultiple = [];
}
else
{
$singleValueToMultiple = [$value];
}
$paramsMultiple = $params;
$paramsMultiple['VALUE'] = $description['multiple'] ? $value : $singleValueToMultiple;
$paramsMultiple['SETTINGS']['MULTIPLE'] = 'Y';
$viewMethod = $propertySettings['PROPERTY_USER_TYPE'][self::USER_TYPE_GET_VIEW_METHOD] ?? null;
if ($viewMethod && is_callable($viewMethod))
{
$additionalValues[$descriptionData['viewList']]['SINGLE'] = $viewMethod($paramsSingle);
$additionalValues[$descriptionData['viewList']]['MULTIPLE'] = $viewMethod($paramsMultiple);
$additionalValues[$descriptionData['view']] = $viewMethod($params);
}
$editMethod = $propertySettings['PROPERTY_USER_TYPE'][self::USER_TYPE_GET_EDIT_METHOD] ?? null;
if ($editMethod && is_callable($editMethod))
{
$additionalValues[$descriptionData['editList']]['SINGLE'] = $editMethod($paramsSingle);
$additionalValues[$descriptionData['editList']]['MULTIPLE'] = $editMethod($paramsMultiple);
$additionalValues[$descriptionData['edit']] = $editMethod($params);
}
}
}
elseif (in_array($description['type'], ['money', 'multimoney'], true) && Loader::includeModule('currency'))
{
$formatMethod = $propertySettings['PROPERTY_USER_TYPE'][self::USER_TYPE_FORMAT_VALUE_METHOD] ?? null;
if ($formatMethod && is_callable($formatMethod))
{
if ($description['type'] === 'money')
{
$additionalMoneyValues = $this->getAdditionalMoneyValues($value, $formatMethod);
$additionalValues[$descriptionData['currencyCode']] = $additionalMoneyValues['currencyCode'];
$additionalValues[$descriptionData['amount']] = $additionalMoneyValues['amount'];
$additionalValues[$descriptionData['formatted']] = $additionalMoneyValues['formatted'];
$additionalValues[$descriptionData['formattedWithCurrency']] = $additionalMoneyValues['formattedWithCurrency'];
}
else
{
foreach ($value as $currentValueElement)
{
$additionalMoneyValues = $this->getAdditionalMoneyValues($currentValueElement, $formatMethod);
$additionalValues[$descriptionData['currencyCode']][] = $additionalMoneyValues['currencyCode'];
$additionalValues[$descriptionData['amount']][] = $additionalMoneyValues['amount'];
$additionalValues[$descriptionData['formatted']][] = $additionalMoneyValues['formatted'];
$additionalValues[$descriptionData['formattedWithCurrency']][] = $additionalMoneyValues['formattedWithCurrency'];
}
}
}
}
elseif ($description['type'] === 'user')
{
$userData = BitrixMainUserTable::getList([
'filter' => ['=ID' => $value],
'select' => [
'ID', 'LOGIN', 'PERSONAL_PHOTO',
'NAME', 'SECOND_NAME', 'LAST_NAME',
'WORK_POSITION',
],
'limit' => 1,
]);
if ($user = $userData->fetch())
{
$pathToProfile = $this->params['PATH_TO']['USER_PROFILE'];
if ($pathToProfile)
{
$additionalValues['PATH_TO_USER_PROFILE'] = $pathToProfile;
$additionalValues['PATH_TO_' . $description['name']] = CComponentEngine::MakePathFromTemplate(
$pathToProfile,
['user_id' => $user['ID']]
);
}
$additionalValues[$description['name'] . '_PERSONAL_PHOTO'] = $user['PERSONAL_PHOTO'];
$additionalValues[$description['name'] . '_WORK_POSITION'] = $user['WORK_POSITION'];
$additionalValues[$description['name'] . '_FORMATTED_NAME'] = CUser::FormatName(
CSite::GetNameFormat(false),
[
'LOGIN' => $user['LOGIN'],
'NAME' => $user['NAME'],
'LAST_NAME' => $user['LAST_NAME'],
'SECOND_NAME' => $user['SECOND_NAME'],
],
true,
false
);
if ((int)$user['PERSONAL_PHOTO'] > 0)
{
$file = new CFile();
$fileInfo = $file->ResizeImageGet(
(int)$user['PERSONAL_PHOTO'],
['width' => 60, 'height' => 60],
BX_RESIZE_IMAGE_EXACT
);
if (is_array($fileInfo) && isset($fileInfo['src']))
{
$additionalValues[$description['name'] . '_PHOTO_URL'] = $fileInfo['src'];
}
}
}
}
}
return $additionalValues;
}