• Модуль: documentgenerator
  • Путь к файлу: ~/bitrix/modules/documentgenerator/lib/controller/template.php
  • Класс: BitrixDocumentGeneratorControllerTemplate
  • Вызов: Template::getDefaultTemplateList
static function getDefaultTemplateList(array $filter = [])
{
	$result = new Result();
	$dataPath = Application::getDocumentRoot().self::DEFAULT_DATA_PATH;

	if(!Directory::isDirectoryExists($dataPath))
	{
		return $result->addError(new Error('Default data directory not found'));
	}
	$templatesFile = new BitrixMainIOFile(Path::combine($dataPath, 'templates.php'));
	if(!$templatesFile->isExists())
	{
		return $result->addError(new Error('File with default templates not found'));
	}
	$templates = include $templatesFile->getPath();
	if(!is_array($templates))
	{
		return $result->addError(new Error('No data in templates file'));
	}

	foreach($templates as $key => $template)
	{
		if(!$template['FILE'])
		{
			$result->addError(new Error('Empty FILE for template'));
			unset($templates[$key]);
			continue;
		}
		if(isset($filter['CODE']) && $template['CODE'] != $filter['CODE'])
		{
			unset($templates[$key]);
			continue;
		}
		if(isset($filter['MODULE_ID']) && $template['MODULE_ID'] != $filter['MODULE_ID'])
		{
			unset($templates[$key]);
			continue;
		}
		if(isset($filter['REGION']))
		{
			if(is_array($filter['REGION']))
			{
				if(!in_array($template['REGION'], $filter['REGION']))
				{
					unset($templates[$key]);
					continue;
				}
			}
			else
			{
				if($filter['REGION'] != $template['REGION'])
				{
					unset($templates[$key]);
					continue;
				}
			}
		}
		if(isset($filter['NAME']) && mb_strpos($template['NAME'], $filter['NAME']) === false)
		{
			unset($templates[$key]);
			continue;
		}
	}

	$templates = array_values($templates);

	$providers = DataProviderManager::getInstance()->getList();
	$extendedProviders = [];
	foreach($providers as $provider)
	{
		if(isset($provider['ORIGINAL']))
		{
			$extendedProviders[$provider['ORIGINAL']][] = $provider;
		}
	}
	$buffer = $names = $codes = [];
	foreach($templates as $template)
	{
		$names[] = $template['NAME'];
		$codes[] = $template['CODE'];
		foreach($template['PROVIDERS'] as $key => $provider)
		{
			$provider = mb_strtolower($provider);
			if(isset($extendedProviders[$provider]))
			{
				unset($template['PROVIDERS'][$key]);
				foreach($extendedProviders[$provider] as $extendedProvider)
				{
					$template['PROVIDER_NAMES'][] = $extendedProvider['NAME'];
					$template['PROVIDERS'][] = $extendedProvider['CLASS'];
				}
			}
			else
			{
				$template['PROVIDER_NAMES'][] = $providers[mb_strtolower($provider)]['NAME'];
			}
		}
		$buffer[$template['CODE']] = $template;
	}
	$templates = $buffer;
	unset($buffer);
	$oldTemplates = TemplateTable::getList([
		'select' => [
			'ID',
			'FILE_ID',
			'NAME',
			'CODE',
			'IS_DELETED',
		],
		'order' => [
			'ID' => 'desc'
		],
		'filter' => [
			'@CODE' => $codes,
			'@NAME' => $names,
		],
	])->fetchAll();
	$unFoundTemplates = $templates;
	foreach($oldTemplates as $oldTemplate)
	{
		foreach($unFoundTemplates as $code => $unFoundTemplate)
		{
			if($oldTemplate['CODE'] == $unFoundTemplate['CODE'] && $oldTemplate['NAME'] == $unFoundTemplate['NAME'])
			{
				$templates[$code]['IS_DELETED'] = $oldTemplate['IS_DELETED'];
				$templates[$code]['ID'] = $oldTemplate['ID'];
				$templates[$code]['FILE_ID'] = $oldTemplate['FILE_ID'];
				unset($unFoundTemplates[$code]);
				break;
			}
		}
	}

	$numeratorCodes = [];
	foreach ($templates as $template)
	{
		$baseNumeratorConfig = $template['NUMERATOR']['CONFIG'][Numerator::getType()] ?? null;
		if ($baseNumeratorConfig && isset($baseNumeratorConfig['code']))
		{
			$numeratorCodes[$baseNumeratorConfig['code']] = (string)$baseNumeratorConfig['code'];
		}
	}

	if (!empty($numeratorCodes))
	{
		$dbIterator =
			NumeratorTable::query()
				->setSelect(['ID', 'CODE'])
				->whereIn('CODE', $numeratorCodes)
				->exec()
		;

		$codeToIdMap = [];
		while ($numerator = $dbIterator->fetchObject())
		{
			$codeToIdMap[$numerator->getCode()] = $numerator->getId();
		}

		foreach ($templates as &$template)
		{
			$code = $template['NUMERATOR']['CONFIG'][Numerator::getType()]['code'] ?? null;
			if ($code && isset($codeToIdMap[$code]))
			{
				$template['NUMERATOR_ID'] = $codeToIdMap[$code];
			}
		}
		unset($template);
	}

	$result->setData($templates);

	return $result;
}