Все мы знаем, что константа 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; ... } } } ... |
Понимаю, что случай довольно частный, но решил поделиться - мало ли кому пригодиться. Можете поделиться в комментах, с какими проблемами при многосайтовости Вам приходилось сталкиваться и какие решения вы принимали. Или мб у Вас есть более красивое решение для задачи, описанной здесь.