• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/site.php
  • Класс: BitrixMainSiteTable
  • Вызов: SiteTable::getByDomain
static function getByDomain(string $host, string $directory)
{
	$site = null;

	$sites = static::getList([
		'select' => ['*'],
		'filter' => ['=ACTIVE' => 'Y'],
		'order' => [
			'DIR_LENGTH' => 'DESC',
			'DOMAIN_LIMITED' => 'DESC',
			'SORT' => 'ASC',
		],
		'cache' => ['ttl' => static::CACHE_TTL],
	])->fetchAll();

	$result = SiteDomainTable::getList([
		'select' => ['LD_LID' => 'LID', 'LD_DOMAIN' => 'DOMAIN'],
		'order' => ['DOMAIN_LENGTH' => 'DESC'],
		'cache' => ['ttl' => static::CACHE_TTL],
	]);

	$domains = [];
	while ($row = $result->fetch())
	{
		$domains[$row['LD_LID']][] = $row;
	}

	$join = [];
	foreach ($sites as $row)
	{
		//LEFT JOIN
		$left = true;
		//LEFT JOIN b_lang_domain LD ON L.LID=LD.LID
		if (array_key_exists($row['LID'], $domains))
		{
			foreach ($domains[$row['LID']] as $dom)
			{
				//AND '".$DB->ForSql($CURR_DOMAIN, 255)."' LIKE CONCAT('%', LD.DOMAIN)
				if (strcasecmp(mb_substr(".".$host, -mb_strlen("." . $dom['LD_DOMAIN'])), "." . $dom['LD_DOMAIN']) == 0)
				{
					$join[] = $row + $dom;
					$left = false;
				}
			}
		}
		if ($left)
		{
			$join[] = $row + ['LD_LID' => '', 'LD_DOMAIN' => ''];
		}
	}

	$rows = [];
	foreach ($join as $row)
	{
		//WHERE ('".$DB->ForSql($cur_dir)."' LIKE CONCAT(L.DIR, '%') OR LD.LID IS NOT NULL)
		if ($row['LD_LID'] != '' || strcasecmp(mb_substr($directory, 0, mb_strlen($row['DIR'])), $row['DIR']) == 0)
		{
			$rows[] = $row;
		}
	}

	foreach ($rows as $row)
	{
		if (
			(strcasecmp(mb_substr($directory, 0, mb_strlen($row['DIR'])), $row['DIR']) == 0)
			&& (($row['DOMAIN_LIMITED'] == 'Y' && $row['LD_LID'] != '') || $row['DOMAIN_LIMITED'] != 'Y')
		)
		{
			$site = $row;
			break;
		}
	}

	if ($site === null)
	{
		foreach ($rows as $row)
		{
			if (strncasecmp($directory, $row['DIR'], mb_strlen($directory)) == 0)
			{
				$site = $row;
				break;
			}
		}
	}

	if($site === null)
	{
		foreach ($rows as $row)
		{
			if (($row['DOMAIN_LIMITED'] == 'Y' && $row['LD_LID'] != '') || $row['DOMAIN_LIMITED'] != 'Y')
			{
				$site = $row;
				break;
			}
		}
	}

	if ($site === null && !empty($rows))
	{
		$site = $rows[0];
	}

	if ($site === null)
	{
		$site = static::getList([
			'select' => ['*'],
			'filter' => ['=ACTIVE' => 'Y'],
			'order' => [
				'DEF' => 'DESC',
				'SORT' => 'ASC',
			],
			'cache' => ['ttl' => static::CACHE_TTL],
		])->fetch();
	}

	if ($site)
	{
  		// unset fields added from left join
		unset($site['LD_LID'], $site['LD_DOMAIN']);
	}

	return $site;
}