Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/location/lib/entity/address/converter/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/location/lib/entity/address/converter/stringconverter.php

<?php

namespace Bitrix\Location\Entity\Address\Converter;

use Bitrix\Location\Entity\Address;
use Bitrix\Location\Entity\Format;
use Bitrix\Main\ArgumentOutOfRangeException;

/**
 * Class StringConverter
 * @package Bitrix\Location\Entity\Address\Converter
 */
final class StringConverter
{
	public const STRATEGY_TYPE_TEMPLATE = 'template';
	public const STRATEGY_TYPE_TEMPLATE_COMMA = 'template_comma';
	public const STRATEGY_TYPE_TEMPLATE_NL = 'template_nl';
	public const STRATEGY_TYPE_TEMPLATE_BR = 'template_br';
	public const STRATEGY_TYPE_FIELD_SORT = 'field_sort';
	public const STRATEGY_TYPE_FIELD_TYPE = 'field_type';

	public const CONTENT_TYPE_HTML = 'html';
	public const CONTENT_TYPE_TEXT = 'text';

	/**
	 * Convert address to string with given format
	 *
	 * @param Address $address
	 * @param Format $format
	 * @param string $strategyType
	 * @param string $contentType
	 * @return string
	 * @throws ArgumentOutOfRangeException
	 */
	public static function convertToString(Address $address, Format $format, string $strategyType, string $contentType): string
	{
		if($strategyType === self::STRATEGY_TYPE_TEMPLATE
			|| $strategyType === self::STRATEGY_TYPE_TEMPLATE_COMMA
			|| $strategyType === self::STRATEGY_TYPE_TEMPLATE_NL
			|| $strategyType === self::STRATEGY_TYPE_TEMPLATE_BR
		)
		{
			$delimiter = null;

			switch ($strategyType)
			{
				case self::STRATEGY_TYPE_TEMPLATE_COMMA:
					$delimiter = ', ';
					break;
				case self::STRATEGY_TYPE_TEMPLATE_NL:
					$delimiter = "\n";
					break;
				case self::STRATEGY_TYPE_TEMPLATE_BR:
					$delimiter = '<br />';
					break;
			}

			$result = self::convertToStringTemplate(
				$address,
				$format->getTemplate(),
				$contentType,
				$delimiter,
				$format
			);
		}
		elseif($strategyType === self::STRATEGY_TYPE_FIELD_SORT)
		{
			$result = self::convertToStringByField($address, $format, $contentType);
		}
		elseif($strategyType === self::STRATEGY_TYPE_FIELD_TYPE)
		{
			$fieldSorter = static function(Format\Field $a, Format\Field $b): int
			{
				$aType = $a->getType();
				$bType = $b->getType();

				if($aType === 0)
				{
					$result = -1;
				}
				elseif ($bType === 0)
				{
					$result = 1;
				}
				else
				{
					$result = $aType - $bType;
				}

				return $result;
			};

			$result = self::convertToStringByField($address, $format, $contentType, $fieldSorter);
		}
		else
		{
			throw new ArgumentOutOfRangeException('strategyType');
		}

		return $result;
	}

	/**
	 * Convert if format has template
	 *
	 * @param Address $address
	 * @param Format\Template $template
	 * @param string $contentType
	 * @param string|null $delimiter
	 * @param Format|null $format
	 * @return string
	 */
	public static function convertToStringTemplate(
		Address $address,
		Format\Template $template,
		string $contentType,
		string $delimiter = null,
		Format $format = null
	): string
	{
		$needHtmlEncode = ($contentType === self::CONTENT_TYPE_HTML);

		if ($delimiter === null)
		{
			$delimiter = $needHtmlEncode ? '<br />' : "\n";
		}

		$templateConverter = new StringTemplateConverter(
			$template->getTemplate(),
			$delimiter,
			$needHtmlEncode,
			$format
		);

		return $templateConverter->convert($address);
	}

	/**
	 * Convert if format has not template
	 *
	 * @param Address $address
	 * @param Format $format
	 * @param string $contentType
	 * @param callable|null $fieldSorter
	 * @return string
	 */
	protected static function convertToStringByField(Address $address, Format $format, string $contentType, callable $fieldSorter = null): string
	{
		$result = '';
		$fields = array_values($format->getFieldCollection()->getItems());

		if($fieldSorter !== null)
		{
			usort($fields, $fieldSorter);
		}

		foreach($fields as $field)
		{
			$fieldValue = $address->getFieldValue($field->getType());

			if($fieldValue === null)
			{
				continue;
			}

			if($contentType === self::CONTENT_TYPE_HTML)
			{
				$fieldValue = htmlspecialcharsbx($fieldValue);
			}

			if($result !== '')
			{
				$result .= $format->getDelimiter();
			}

			$result .= $fieldValue;
		}

		return $result;
	}
}