• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/document.php
  • Класс: BitrixDocumentGeneratorDocument
  • Вызов: Document::getProviderValue
protected function getProviderValue($name, DataProvider $dataProvider = null, $fullChain = '')
{
	$value = '';

	// if not a string - there is no provider chain.
	if(!is_string($name))
	{
		return $value;
	}
	$nameParts = explode('.', $name);
	if(count($nameParts) > 1)
	{
		// here we move from left to right.
		$providerName = $nameParts[0];
		if($dataProvider === null)
		{
			// if it is the first iteration - get value from $this.
			$value = $this->getValue($providerName);
		}
		else
		{
			$value = $dataProvider->getValue($providerName);
		}
		// here we handle multiple values for inner providers
		if(is_array($value) && $dataProvider)
		{
			$value = $this->handleMultipleProviderValue($value, $dataProvider, $fullChain, $providerName);
			if(is_array($value))
			{
				return $value;
			}

			// initialize child data provider manually
			$value = DataProviderManager::getInstance()->createDataProvider(
				$dataProvider->getFields()[$providerName],
				$value,
				$dataProvider,
				$providerName
			);
		}
		array_shift($nameParts);
		// combine valueName from all parts but first
		$valueName = implode('.', $nameParts);
		if($value instanceof ArrayDataProvider)
		{
			// if current value is an ArrayDataProvider and $valueName doesn't point to ArrayDataProvider outer field
			// then we assume that this $name points to the field of ArrayDataProvider item - thus
			// we need to return $name as it is.
			// In Body there will be a cycle with this $name as placeholder.
			$providerFields = $value->getFields();
			if(
				$valueName !== ArrayDataProvider::NUMBER_PLACEHOLDER
				&& !in_array($valueName, $providerFields, true)
			)
			{
				return $name;
			}
		}
		// if there is PROVIDER in field description then we need to initialize new provider of this type on $value.
		if(isset($this->fields[$providerName]['PROVIDER']))
		{
			$value = DataProviderManager::getInstance()->createDataProvider(
				$this->fields[$providerName],
				$value,
				$dataProvider,
				$providerName
			);
		}
		if($value instanceof DataProvider)
		{
			if(
				$this->isCheckAccess
				&& $value->isLoaded()
				&& !DataProviderManager::getInstance()->checkDataProviderAccess($value)
			)
			{
				$value = null;
			}
			else
			{
				$value = $this->getProviderValue($valueName, $value, $name);
			}
		}
	}
	// if it is not the first iteration, there are no more providers in chain and we got $dataProvider.
	elseif($dataProvider)
	{
		$value = $dataProvider->getValue($name);
	}

	return $value;
}