• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/dataprovidermanager.php
  • Класс: BitrixDocumentGeneratorDataProviderManager
  • Вызов: DataProviderManager::getProviderFields
public function getProviderFields(
	DataProvider $parentDataProvider,
	$placeholders = [],
	$isCopyFields = false,
	array $chain = [],
	array $group = [],
	$isArray = false,
	array $providers = [],
	$stopRecursion = false
): array
{
	$values = [];
	if($parentDataProvider->isRootProvider())
	{
		$providers[] = get_class($parentDataProvider);
	}
	$fields = $parentDataProvider->getFields();
	if(is_array($placeholders) && empty($placeholders))
	{
		return $values;
	}
	$copyPlaceholders = [];
	if($isCopyFields)
	{
		// build copied placeholders map
		foreach($fields as $placeholder => $field)
		{
			if(isset($field['OPTIONS']['COPY']))
			{
				if(is_array($placeholders) && !empty($placeholders))
				{
					$copyChain = $chain;
					$copyChain[] = $placeholder;
					$currentValue = $this->valueToPlaceholder(implode('.', $copyChain));
					foreach($placeholders as $name)
					{
						if(mb_strpos($name, $currentValue) === 0)
						{
							$copyPlaceholders[$placeholder] = $field['OPTIONS']['COPY'];
							$placeholders[] = str_replace($this->valueToPlaceholder($placeholder), $this->valueToPlaceholder($field['OPTIONS']['COPY']), $name);
							break;
						}
					}
				}
				else
				{
					$copyPlaceholders[$placeholder] = $field['OPTIONS']['COPY'];
				}
			}
		}
	}
	foreach($fields as $placeholder => $field)
	{
		$chain[] = $placeholder;
		$goDeeper = true;
		if(is_array($placeholders))
		{
			$goDeeper = false;
			$currentValue = $this->valueToPlaceholder(implode('.', $chain));
			foreach($placeholders as $name)
			{
				if(mb_strpos($name, $currentValue) === 0)
				{
					$goDeeper = true;
					break;
				}
			}
		}
		if(!$goDeeper)
		{
			array_pop($chain);
			continue;
		}
		$dataProvider = $this->createDataProvider($field, ' ', $parentDataProvider);
		if(isset($field['TITLE']) && !empty($field['TITLE']))
		{
			$group[] = $field['TITLE'];
		}
		else
		{
			$group[] = $this->valueToPlaceholder($placeholder);
		}
		if(
			$dataProvider &&
			(($dataProvider->isRootProvider() && !$stopRecursion) ||
			(!$dataProvider->isRootProvider()))
		)
		{
			if($dataProvider instanceof ArrayDataProvider)
			{
				$isArray = true;
			}
			$stopRecursion = false;
			if(count($providers) > self::MAX_DEPTH_LEVEL_ROOT_PROVIDERS)
			{
				$stopRecursion = true;
			}
			$values = array_merge(
				$values,
				$this->getProviderFields(
					$dataProvider,
					$placeholders,
					$isCopyFields,
					$chain,
					$group,
					$isArray,
					$providers,
					$stopRecursion
				)
			);
			$isArray = false;
		}
		else
		{
			if($isArray)
			{
				$field['OPTIONS']['IS_ARRAY'] = true;
			}
			$value = implode('.', $chain);
			if($isCopyFields || (!$isCopyFields && !isset($field['OPTIONS']['COPY'])))
			{
				$values[] = array_merge($field, [
					'VALUE' => $value,
					'GROUP' => $group,
				]);
			}
		}
		array_pop($group);
		array_pop($chain);
	}
	foreach($copyPlaceholders as $destPlaceholder => $sourcePlaceholder)
	{
		foreach($values as $field)
		{
			if(is_string($field['VALUE']) && mb_strpos($field['VALUE'], $sourcePlaceholder) !== false)
			{
				$field['VALUE'] = str_replace($sourcePlaceholder, $destPlaceholder, $field['VALUE']);
				$values[] = $field;
			}
		}
	}

	return $values;
}