• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/document.php
  • Класс: BitrixDocumentGeneratorDocument
  • Вызов: Document::resolveProvider
protected function resolveProvider(array $field, string $name): void
{
	if(empty($field['PROVIDER']))
	{
		return;
	}
	if(isset($field['VALUE']))
	{
		$this->values[$name] = $field['VALUE'];
	}
	$parentDataProvider = null;
	if($name !== Template::MAIN_PROVIDER_PLACEHOLDER && $name !== Template::DOCUMENT_PROVIDER_PLACEHOLDER)
	{
		$parentDataProvider = $this->getProvider();
		if(!$parentDataProvider)
		{
			$parentDataProvider = null;
		}
	}
	$value = $this->getValue($name);
	$dataProvider = DataProviderManager::getInstance()->createDataProvider($field, $value, $parentDataProvider);
	if($dataProvider && $dataProvider->isLoaded())
	{
		if($this->isCheckAccess && !DataProviderManager::getInstance()->checkDataProviderAccess($dataProvider))
		{
			$this->result->addError(new Error('Access denied to provider '.$field['PROVIDER'].' for placeholder '.$name));
			return;
		}
		if($dataProvider instanceof ArrayDataProvider && $dataProvider->getItemKey())
		{
			$this->fieldNames[$name] = $name;
		}
		$providerFields = $dataProvider->getFields();
		foreach($providerFields as $placeholder => $providerField)
		{
			$fullName = $name.'.'.$placeholder;
			if(!isset($this->fields[$fullName]))
			{
				$this->fields[$fullName] = [];
			}

			$providerValue = $dataProvider->getValue($placeholder);
			if($providerValue instanceof ArrayDataProvider)
			{
				// here we add inner item of the ArrayDataProvider to the fields.
				$this->fields[$placeholder] = [
					'VALUE' => static::THIS_PLACEHOLDER.'.'.$fullName,
				];
				$this->fieldNames[$placeholder] = $placeholder;
			}

			$this->fields[$fullName] = array_merge($this->fields[$fullName], ['VALUE' => $providerValue]);
		}
		if(isset($this->externalValues[$name]))
		{
			$this->values[$name] = $dataProvider;
			unset($this->externalValues[$name]);
		}
	}
	else
	{
		$this->result->addError(new Error('Cant resolve provider '.$field['PROVIDER'].' for placeholder '.$name));
	}
}