• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/businessvalue.php
  • Класс: BitrixSaleHelpersAdminBusinessValueControl
  • Вызов: BusinessValueControl::setMapFromPost
public function setMapFromPost()
{
	if ($this->consumerCodePersonMapping)
		throw new SystemException('Map is already set from post!');

	if (isset($_POST[$this->name]['MAP']) && is_array($_POST[$this->name]['MAP']))
	{
		$_POST = InputFile::getPostWithFiles($_POST, $_FILES);
		$consumerCodePersonMapping = $_POST[$this->name]['MAP'];
		unset($_POST[$this->name]['MAP']);

		$errors = array();

		$consumers = BusinessValue::getConsumers();

		foreach ($consumerCodePersonMapping as $consumerKey => &$codePersonMapping)
		{
			if ($consumerKey === BusinessValueTable::COMMON_CONSUMER_KEY)
			{
				$consumerKey = null;
				$consumerCodePersonMapping[null] = &$codePersonMapping;
				unset($consumerCodePersonMapping[BusinessValueTable::COMMON_CONSUMER_KEY]);
			}

			if (! (($consumer = $consumers[$consumerKey]) && is_array($consumer) && is_array($codePersonMapping)))
			{
				unset($consumerCodePersonMapping[$consumerKey]);
				continue;
			}

			if (! (($codes = $consumer['CODES']) && is_array($codes)))
				$codes = array();

			$skipNewCodeSanitation = $consumer['SKIP_NEW_CODE_SANITATION'] ?? false;

			$sanitizeMapping = $consumer['SANITIZE_MAPPING'] ?? null;
			if (!is_callable($sanitizeMapping))
			{
				$sanitizeMapping = null;
			}

			$renderColumns = $consumer['RENDER_COLUMNS'] ?? null;
			if (
				(! $codes && ! $skipNewCodeSanitation)
				|| ($skipNewCodeSanitation && ! $sanitizeMapping)
				|| (is_callable($renderColumns) && ! $sanitizeMapping)
			)
			{
				unset($consumerCodePersonMapping[$consumerKey]);
				continue;
			}

			foreach ($codePersonMapping as $codeKey => &$personMapping)
			{
				$code = $codes[$codeKey];

				if (! (is_array($personMapping) && (is_array($code) || $skipNewCodeSanitation)))
				{
					unset($codePersonMapping[$codeKey]);
					continue;
				}

				foreach ($personMapping as $personTypeId => &$mapping)
				{
					if ($personTypeId === BusinessValueTable::COMMON_PERSON_TYPE_ID) // must be === coz 0 & null
					{
						$personTypeId = null;
						$personMapping[null] = &$mapping;
						unset($personMapping[BusinessValueTable::COMMON_PERSON_TYPE_ID]);
					}

					$codeDomains = $code['DOMAINS'] ?? null;
					$personType = self::$personTypes[$personTypeId] ?? null;

					if (! is_array($code) && $skipNewCodeSanitation)
					{
						//$skipNewCodeSanitation
					}
					elseif (! (is_array($code)
						&& (! isset($code['PERSON_TYPE_ID']) || $code['PERSON_TYPE_ID'] == $personTypeId)
						&& (! is_array($codeDomains) || in_array($personType['DOMAIN'], $codeDomains, true))
						&& is_array($mapping)))
					{
						unset($personMapping[$personTypeId]);
						continue;
					}

					// delete record
					if (
						!empty($mapping['DELETE'])
						|| empty($mapping['PROVIDER_KEY'])
						|| empty($mapping['PROVIDER_VALUE'])
					)
					{
						continue;
					}

					if ($sanitizeMapping)
					{
						if ($e = call_user_func_array($sanitizeMapping, array($codeKey, $personTypeId, &$mapping)))
							$errors[$consumerKey][$codeKey][$personTypeId] = $e;
					}
					elseif (isset($code['INPUT']) && is_array($code['INPUT']))
					{
						$mapping['PROVIDER_KEY'] = 'INPUT';

						if ($e = InputManager::getError($code['INPUT'], $mapping['PROVIDER_VALUE'] ?? []))
							$errors[$consumerKey][$codeKey][$personTypeId]['PROVIDER_VALUE'] = $e;
					}
					else
					{
						if ($e = self::sanitizeMapping($personTypeId, $mapping, $code['PROVIDERS'] ?? $consumer['PROVIDERS'] ?? []))
							$errors[$consumerKey][$codeKey][$personTypeId] = $e;
					}

					if (! $mapping)
					{
						unset($personMapping[$personTypeId]); // remove from post
					}
				}
			}
		}

		$this->consumerCodePersonMapping = $consumerCodePersonMapping;
		$this->errors = $errors;
	}

	return ! $this->errors;
}