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