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