Все мы знаем, что константа SITE_ID в публичной и административной части ведёт себя по разному. В одном случае это реальный id сайта, в другом лишь индификатор языковой версии. И если у Вас всего 1 или 2 сайт (ru и en версии) на одном ядре, то с этим ещё более менее можно жить при разработке, но что делать, когда есть 1 основной сайт и N филиалов, для каждого из которых есть несколько языковых версий, а запускать какие-то обработчики или отправлять почтовые события, работая в административной панели, хотелось бы для каких-то определенных сайтов?
Так и случилось в моем случа, когда остро встал вопрос о точном определении, под каким же из сайтов в данный момент сейчас работает пользователь в админке. Накидал простенький хелпер для себя, которым и хотелось бы поделиться. Для начала немного "дано"
Каждый филиал находится в собственной директории на сервере, для каждого филиала может существовать несколько языковых версий, который вынесены в собственные подкатегории. Т.е. примерная структура на сервере выглядит так:
Настройки для каждого сайта в админке выглядят примерно так:

Ядро битрикса прокинуто для каждого филиала симлинком, все собственные классы вынесены за директории www и ext_www и подтягиваются с помощью composer для всех сайтов в init.php (не думаю, что на этом стоит заострять внимание)
Собственно сам хелпер:
Использовать его можно примерно так (в моем случае для автоопределения констант или же для отправки почтовых событий):
Понимаю, что случай довольно частный, но решил поделиться - мало ли кому пригодиться. Можете поделиться в комментах, с какими проблемами при многосайтовости Вам приходилось сталкиваться и какие решения вы принимали. Или мб у Вас есть более красивое решение для задачи, описанной здесь.
Так и случилось в моем случа, когда остро встал вопрос о точном определении, под каким же из сайтов в данный момент сейчас работает пользователь в админке. Накидал простенький хелпер для себя, которым и хотелось бы поделиться. Для начала немного "дано"
Каждый филиал находится в собственной директории на сервере, для каждого филиала может существовать несколько языковых версий, который вынесены в собственные подкатегории. Т.е. примерная структура на сервере выглядит так:
../www/ | s1 (основной сайт) ../www/en/ | s2 ../www/ua/ | s3 ../ext_www/site1/ | a1 (филиалы) ../ext_www/site1/en/ | a2 ../ext_www/site1/ua/ | a3 ../ext_www/site2/ | b1 ../ext_www/site2/en/ | b2 ../ext_www/site3/ua/ | b3 ../src/ ../composer.json ....... |
Настройки для каждого сайта в админке выглядят примерно так:

Ядро битрикса прокинуто для каждого филиала симлинком, все собственные классы вынесены за директории www и ext_www и подтягиваются с помощью composer для всех сайтов в init.php (не думаю, что на этом стоит заострять внимание)
Собственно сам хелпер:
<?php
namespace MySpace\Helper;
use Bitrix\Main\Context;
use Bitrix\Main\SiteTable;
/**
* Class Site
* @package MySpace\Helper
*/
class Site
{
/**
* @var
*/
private $sDocRoot;
/**
* Site constructor.
*/
public function __construct()
{
$objServer = Context::getCurrent()->getServer();
$this->sDocRoot = $objServer->getDocumentRoot();
}
/**
* @return string
*/
public function getSiteID()
{
if (defined("SITE_ID")) {
switch (SITE_ID) {
case "en" :
case "ru" :
case "ua" :
return $this->getSiteIDByLang(SITE_ID);
break;
default :
return SITE_ID;
}
}
return "";
}
/**
* @param $sSiteLang
* @return string
*/
private function getSiteIDByLang($sSiteLang)
{
$rsSites = SiteTable::getList(
array(
"filter" => array(
"=DOC_ROOT" => $this->sDocRoot . "/",
"=LANGUAGE_ID" => $sSiteLang
)
)
);
if ($arSite = $rsSites->fetch()) {
return $arSite["LID"];
}
return "";
}
} |
Использовать его можно примерно так (в моем случае для автоопределения констант или же для отправки почтовых событий):
...
/**
* init define constants for iblocks
*/
private static function initIBlockConstants()
{
$rsIBlock = \CIBlock::GetList(
array(),
array(
"=LID" => (new Site())->getSiteID(),
"CHECK_PERMISSIONS" => "N"
)
);
while ($arIBlock = $rsIBlock->Fetch()) {
switch ($arIBlock["IBLOCK_TYPE_ID"]) {
...
case "news":
self::define("IBLOCK_ID_NEWS", $arIBlock["ID"]);
break;
case "smi":
self::define("IBLOCK_ID_MONITORING_SMI", $arIBlock["ID"]);
break;
case "gallery":
self::define("IBLOCK_ID_GALLERY", $arIBlock["ID"]);
break;
case "materials_main":
self::define("IBLOCK_ID_MATERIARLS_MAIN", $arIBlock["ID"]);
break;
...
}
}
}
...
|
Понимаю, что случай довольно частный, но решил поделиться - мало ли кому пригодиться. Можете поделиться в комментах, с какими проблемами при многосайтовости Вам приходилось сталкиваться и какие решения вы принимали. Или мб у Вас есть более красивое решение для задачи, описанной здесь.