- Модуль: 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;
}