• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/integration/documentgenerator/productloader.php
  • Класс: Bitrix\Crm\Integration\DocumentGenerator\ProductLoader
  • Вызов: ProductLoader::getPreparedPropertyValue
protected function getPreparedPropertyValue(array $property, int $elementId)
{
	$propertyId = (int)$property['ID'];
	if (
		isset($this->preparedPropertyValues[$propertyId])
		&& array_key_exists($elementId, $this->preparedPropertyValues[$propertyId])
	)
	{
		return $this->preparedPropertyValues[$propertyId][$elementId];
	}

	$propertyValue = $this->getRawPropertyValue($property, $elementId);
	if (empty($propertyValue))
	{
		return null;
	}
	$isMultiple = (isset($property['MULTIPLE'])
		&& $property['MULTIPLE'] === 'Y'
		&& is_array($propertyValue)
	);

	if ($property['PROPERTY_TYPE'] === 'F')
	{
		if (is_array($propertyValue))
		{
			$propertyValue = reset($propertyValue);
		}
		$propertyValue = (int)$propertyValue;
		if ($propertyValue > 0)
		{
			$this->preparedPropertyValues[$propertyId][$elementId] = \CFile::GetPath($propertyValue);
			return $this->preparedPropertyValues[$propertyId][$elementId];
		}
	}
	if ($property['PROPERTY_TYPE'] === 'S')
	{
		if ($property['USER_TYPE'] === 'HTML')
		{
			$getTextFromValue = static function($propertyValue): ?string {
				if (!empty($propertyValue) && is_string($propertyValue))
				{
					$propertyValue = unserialize($propertyValue, ['allowed_classes' => false]);
				}
				if (is_array($propertyValue) && (isset($propertyValue['HTML']) || isset($propertyValue['TEXT'])))
				{
					return $propertyValue['HTML'] ?? $propertyValue['TEXT'];
				}

				return null;
			};
			if ($isMultiple)
			{
				$propertyValue = array_map($getTextFromValue, $propertyValue);
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple($propertyValue);
			}
			else
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = $getTextFromValue($propertyValue);
			}

			return $this->preparedPropertyValues[$propertyId][$elementId];
		}
		if ($property['USER_TYPE'] === 'Date')
		{
			if ($isMultiple)
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple(
					array_map(
						static function($value) {
							return new Value\DateTime($value);
						},
						$propertyValue
					)
				);
			}
			else
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\DateTime($propertyValue);
			}

			return $this->preparedPropertyValues[$propertyId][$elementId];
		}
		if ($property['USER_TYPE'] === 'DateTime')
		{
			if ($isMultiple)
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple(
					array_map(
						static function($value) {
							return new Value\DateTime(
								$value,
								[
									'format' => DateTime::getFormat(DataProviderManager::getInstance()->getCulture()),
								]
							);
						},
						$propertyValue
					)
				);
			}
			else
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\DateTime(
					$propertyValue,
					[
						'format' => DateTime::getFormat(DataProviderManager::getInstance()->getCulture()),
					]
				);
			}

			return $this->preparedPropertyValues[$propertyId][$elementId];
		}
		if ($property['USER_TYPE'] === 'Money')
		{
			if ($isMultiple)
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple(
					array_map(
						static function ($value) {
							if (!is_string($value))
							{
								return null;
							}

							[$value, $currency] = explode('|', $value);

							return new Money($value, [
								'CURRENCY_ID' => $currency,
							]);
						},
						$propertyValue
					)
				);
			}
			elseif(is_string($propertyValue))
			{
				[$value, $currency] = explode('|', $propertyValue);
				$this->preparedPropertyValues[$propertyId][$elementId] = new Money($value, [
					'CURRENCY_ID' => $currency,
				]);
			}
			else
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = null;
			}

			return $this->preparedPropertyValues[$propertyId][$elementId];
		}
		if ($property['USER_TYPE'] === 'directory')
		{
			if ($isMultiple)
			{
				$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple(
					$this->getPropertyDirectoryValueMultiple($property, $propertyValue)
				);
			}
			else
			{
				$value = $this->getPropertyDirectoryValue($property, $propertyValue);
				$this->preparedPropertyValues[$propertyId][$elementId] = $value['VALUE'] ?? null;
			}

			return $this->preparedPropertyValues[$propertyId][$elementId];
		}
		if ($property['USER_TYPE'] === 'employee' || $property['USER_TYPE'] === 'ECrm')
		{
			if ($isMultiple)
			{
				$propertyValue = reset($propertyValue);
				$isMultiple = false;
			}
		}
	}
	elseif ($property['PROPERTY_TYPE'] === 'L')
	{
		if ($isMultiple)
		{
			$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple(
				$this->getPropertyEnumValueMultiple($propertyId, $propertyValue)
			);
		}
		else
		{
			$this->preparedPropertyValues[$propertyId][$elementId] = $this->getPropertyEnumValue($propertyId, $propertyValue);
		}

		return $this->preparedPropertyValues[$propertyId][$elementId];
	}
	elseif ($property['PROPERTY_TYPE'] === 'E')
	{
		if ($isMultiple)
		{
			$this->preparedPropertyValues[$propertyId][$elementId] = new Value\Multiple(
				$this->getPropertyElementValueMultiple($propertyValue)
			);
		}
		else
		{
			$this->preparedPropertyValues[$propertyId][$elementId] = $this->getPropertyElementValue((int)$propertyValue);
		}

		return $this->preparedPropertyValues[$propertyId][$elementId];
	}
	elseif ($property['PROPERTY_TYPE'] === 'N')
	{
		if ($isMultiple)
		{
			$propertyValue = array_map('floatval', $propertyValue);
		}
		else
		{
			$propertyValue = (float)$propertyValue;
		}
	}

	if ($isMultiple)
	{
		$propertyValue = new Value\Multiple($propertyValue);
	}

	$this->preparedPropertyValues[$propertyId][$elementId] = $propertyValue;
	return $this->preparedPropertyValues[$propertyId][$elementId];
}