• Модуль: report
  • Путь к файлу: ~/bitrix/modules/report/classes/general/report.php
  • Класс: CReport
  • Вызов: CReport::appendHrefSelectElements
static function appendHrefSelectElements(&$elem, $fList, $entity, $helper_class, &$select, &$runtime)
{
	// default href assign
	if (empty($elem['href']))
	{
		$href = call_user_func(array($helper_class, 'getDefaultElemHref'), $elem, $fList);

		if (!empty($href))
		{
			$elem['href'] = $href;
		}
	}

	// user defined or default href
	if (!empty($elem['href']))
	{
		$matches = array();
		preg_match_all('/#([a-zA-Z0-9_.:\\]+)#/', $elem['href']['pattern'], $matches);

		if (!empty($matches[1]))
		{
			foreach ($matches[1] as $match)
			{
				// by default get definition from href
				$fieldDefinition = $match;
				$fieldAggr = null;

				// try to find extended info about href element
				if (!empty($elem['href']['elements'][$fieldDefinition]))
				{
					$fieldDefinition = $elem['href']['elements'][$match]['name'];

					if (!empty($elem['href']['elements'][$match]['aggr']))
					{
						$fieldAggr = $elem['href']['elements'][$match]['aggr'];
					}
					else
					{
						// normalize
						$elem['href']['elements'][$match]['aggr'] = null;
					}
				}
				else
				{
					// normalize
					$elem['href']['elements'][$fieldDefinition] = array(
						'name' => $fieldDefinition,
						'aggr' => null
					);
				}

				$fieldAlias = EntityQueryChain::getAliasByDefinition($entity, $fieldDefinition);

				// add to select
				if (empty($fieldAggr) && !in_array($fieldDefinition, $select, true))
				{
					$select[$fieldAlias] = $fieldDefinition;
				}
				elseif (!empty($fieldAggr))
				{
					$fieldAlias = $fieldAggr.'_'.$fieldAlias;

					// add if not exists
					if (!array_key_exists($fieldAlias, $select))
					{
						// get field object
						$chain = EntityQueryChain::getChainByDefinition($entity, $fieldDefinition);
						$field = $chain->getLastElement()->getValue();

						// add to select
						if ($fieldAggr == 'COUNT_DISTINCT')
						{
							$runtime[$fieldAlias] = array(
								'data_type' => 'integer',  // until we don't have group_concat
								'expression' => array(
									'COUNT(DISTINCT %s)', $fieldDefinition
								)
							);
						}
						else
						{
							$runtime[$fieldAlias] = array(
								'data_type' => call_user_func(array($helper_class, 'getFieldDataType') ,$field),
								'expression' => array(
									$fieldAggr.'(%s)', $fieldDefinition
								)
							);
						}

						$select[] = $fieldAlias;
					}
				}
			} // href pattern and elements saved
		}
	}
}