• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/provider/templateprovider.php
  • Класс: BitrixTasksProviderTemplateProvider
  • Вызов: TemplateProvider::makeFrom
private function makeFrom(): self
{
	$selectBaseTemplateId = in_array('BASE_TEMPLATE_ID', $this->arSelect);
	$useChildrenCount = in_array('TEMPLATE_CHILDREN_COUNT', $this->arSelect);

	foreach($this->arOrder as $field => $direction)
	{
		if($field == 'BASE_TEMPLATE_ID')
		{
			$selectBaseTemplateId = true;
		}
		if($field == 'TEMPLATE_CHILDREN_COUNT')
		{
			$useChildrenCount = true;
		}
	}

	foreach($this->arFilter as $key => $value)
	{
		$keyParsed = CTasks::MkOperationFilter($key);
		if($keyParsed['FIELD'] == 'TEMPLATE_CHILDREN_COUNT')
		{
			$useChildrenCount = true;
		}
	}

	$includeSubtree = isset($this->arParams['INCLUDE_TEMPLATE_SUBTREE']) && ($this->arParams['INCLUDE_TEMPLATE_SUBTREE'] === true || $this->arParams['INCLUDE_TEMPLATE_SUBTREE'] === 'Y');
	$excludeSubtree = isset($this->arParams['EXCLUDE_TEMPLATE_SUBTREE']) && ($this->arParams['EXCLUDE_TEMPLATE_SUBTREE'] === true || $this->arParams['EXCLUDE_TEMPLATE_SUBTREE'] === 'Y');

	if($excludeSubtree)
	{
		$treeJoin = "";
	}
	else
	{
		$treeJoin = "LEFT JOIN ". DependencyTable::getTableName() ." TD on TT.ID = TD.TEMPLATE_ID".($includeSubtree ? "" : " AND TD.DIRECT = 1");
	}

	$temporalTableName = BitrixTasksDBHelper::getTemporaryTableNameSql();

	$this->strFrom = "FROM
			b_tasks_template TT

		". $treeJoin ."

		".($selectBaseTemplateId ? "
		LEFT JOIN
			". DependencyTable::getTableName() ." TDD ON TT.ID = TDD.TEMPLATE_ID AND TDD.DIRECT = 1
		" : "
		")."

		".($useChildrenCount ? "
			LEFT JOIN (
				SELECT TTI.ID, COUNT(TDDC.TEMPLATE_ID) AS TEMPLATE_CHILDREN_COUNT
				from
					b_tasks_template TTI
					INNER JOIN ". DependencyTable::getTableName() ." TDDC ON TTI.ID = TDDC.PARENT_TEMPLATE_ID AND TDDC.DIRECT = 1
				GROUP BY TTI.ID
			) ".$temporalTableName." on ".$temporalTableName.".ID = TT.ID
		" : "
		")."

		LEFT JOIN
			b_user CU ON CU.ID = TT.CREATED_BY
		LEFT JOIN
			b_user RU ON RU.ID = TT.RESPONSIBLE_ID
		INNER JOIN
			 " . ScenarioTable::getTableName() . " TS ON TS.TEMPLATE_ID = TT.ID

		". $this->obUserFieldsSql->GetJoin("TT.ID");

	return $this;
}