• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/dataprovidermanager.php
  • Класс: BitrixDocumentGeneratorDataProviderManager
  • Вызов: DataProviderManager::calculateDataProviderValue
protected function calculateDataProviderValue(DataProvider $dataProvider, $placeholder)
{
	$fields = $dataProvider->getFields();
	if(!isset($fields[$placeholder]))
	{
		return false;
	}

	$fieldDescription = $fields[$placeholder];

	// rewrite inner values from options.
	$value = false;
	$values = [];
	if(isset($fieldDescription['OPTIONS']['VALUES']) && is_array($fieldDescription['OPTIONS']['VALUES']))
	{
		$values = $fieldDescription['OPTIONS']['VALUES'];
	}
	$options = $dataProvider->getOptions();
	if(
		isset($options['VALUES']) &&
		is_array($options['VALUES'])
	)
	{
		$values = array_merge($values, $options['VALUES']);
	}

	if(isset($values[$placeholder]))
	{
		$value = $values[$placeholder];
	}

	$calculatedValue = false;
	if(isset($fieldDescription['VALUE']))
	{
		$calculatedValue = $this->getValue($fieldDescription['VALUE'], $dataProvider, $placeholder);
	}
	if(is_array($calculatedValue) && count($calculatedValue) > 0 && is_array(reset($calculatedValue)))
	{
		$selectedFound = false;
		if($value)
		{
			foreach($calculatedValue as &$calcVal)
			{
				if($calcVal['VALUE'] != $value)
				{
					$calcVal['SELECTED'] = false;
				}
				else
				{
					$calcVal['SELECTED'] = true;
					$selectedFound = true;
				}
			}
			unset($calcVal);
		}
		if(!$selectedFound)
		{
			foreach($calculatedValue as &$calcVal)
			{
				if(isset($calcVal['SELECTED']) && $calcVal['SELECTED'] === true)
				{
					$selectedFound = true;
					break;
				}
			}
			unset($calcVal);
		}
		if(!$selectedFound)
		{
			foreach($calculatedValue as &$calcVal)
			{
				$calcVal['SELECTED'] = true;
				break;
			}
			unset($calcVal);
		}
		$value = $calculatedValue;
	}

	if(!$value)
	{
		$value = $this->getValueFromList($calculatedValue);
	}
	else
	{
		$value = $calculatedValue;
	}

	if($value && isset($fieldDescription['PROVIDER']))
	{
		// if $value is array and Provider does not accept array as value - returns $values as it is - to allow user decide
		// which value to use.
		if(is_array($value) && !$this->isProviderArray($fieldDescription['PROVIDER']))
		{
			return $value;
		}
		$value = $this->createDataProvider($fieldDescription, $value, $dataProvider, $placeholder);
	}

	return $value;
}