• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/component/baseform.php
  • Класс: BitrixCatalogComponentBaseForm
  • Вызов: BaseForm::getAdditionalValues
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;
}