Многосайтовость — одна из ключевых «фишек» Битрикс.
Она позволяет управлять неограниченным количеством сайтов (с разными доменами, шаблонами и контентом) из одной административной панели на базе одной лицензии.
Как это работает?
При каждом хите Битрикс определяет, к какому сайту обращается пользователь, на основе домена, папки или языковых параметров. После этого определяются две важнейшие константы:
- SITE_ID: Уникальный идентификатор сайта (например, s1, s2, en).
- SITE_TEMPLATE_PATH: Путь к шаблону текущего сайта (например, /local/templates/main_template/).
Именно эти константы являются ключом к разделению логики и представления.
1. Разделение шаблонов (представления)
Это самый простой и очевидный уровень разделения.
Способ А: Разные шаблоны для разных сайтов
- Создайте разные шаблоны: В папке /local/templates/ создайте папки для каждого сайта (например, site_s1, site_s2).
- Назначьте шаблоны сайтам: В административной панели (Настройки -> Настройки продукта -> Сайты -> Список сайтов) для каждого сайта на вкладке «Шаблоны» укажите свой дизайн.
Способ Б: Условная логика в одном общем шаблоне
Иногда сайты очень похожи, и создавать два разных шаблона нецелесообразно. В этом случае можно использовать SITE_ID прямо в header.php или footer.php общего шаблона.
// /local/templates/common_template/header.php
// Показываем разный логотип для разных сайтов
if (SITE_ID === 's1') {
$logoPath = '/images/logo_s1.png';
} else {
$logoPath = '/images/logo_s2.png';
}
?>
<a href="/"><img src="<?= $logoPath ?>" alt="Логотип"></a>
<?
// Подключаем разные файлы стилей
if (file_exists($_SERVER['DOCUMENT_ROOT'] . SITE_TEMPLATE_PATH . '/css/' . SITE_ID . '.css')) {
$APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . '/css/' . SITE_ID . '.css');
}
2. Разделение контента (логики)
Способ А: Разные инфоблоки
Это самый правильный и масштабируемый подход. Для каждого сайта создаются свои инфоблоки (новости, каталог и т.д.).
В настройках компонента на странице вы просто указываете нужный IBLOCK_ID.
- На сайте s1 компонент news.list работает с инфоблоком ID=5 («Новости сайта 1»).
- На сайте s2 тот же компонент news.list работает с инфоблоком ID=6 («Новости сайта 2»).
Способ Б: Один инфоблок на несколько сайтов
Иногда нужно, чтобы контент был общим, но частично отличался. Для этого используется свойство типа «Привязка к сайту» (LID).
- В настройках инфоблока создайте свойство (например, с кодом SITE_BINDING) типа «Привязка к сайту».
- В каждом элементе указывайте, на каких сайтах он должен отображаться.
- В фильтре компонента GetList добавьте условие по этому свойству.
// В component.php компонента новостей
$arFilter = [
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"ACTIVE" => "Y",
"PROPERTY_SITE_BINDING" => SITE_ID // Фильтруем по текущему сайту
];
3. Разделение кастомной логики (init.php)
Для каждого сайта можно создать свой файл init.php, который будет выполняться только для него.
- /local/php_interface/s1/init.php — выполнится только для сайта s1.
- /local/php_interface/s2/init.php — выполнится только для сайта s2.
- /local/php_interface/init.php — выполнится для всех сайтов.
Это позволяет регистрировать разные обработчики событий или определять разные константы для каждого сайта.
Пример: Разные настройки для почтовых событий.
// /local/php_interface/s1/init.php
// Для сайта s1 отправляем копии на один email
AddEventHandler("main", "OnBeforeEventSend", "addCopyToEmail_s1");
function addCopyToEmail_s1(&$arFields, &$arTemplate) {
$arFields['BCC'] = 's1_archive@mycompany.com';
}
// /local/php_interface/s2/init.php
// Для сайта s2 — на другой
AddEventHandler("main", "OnBeforeEventSend", "addCopyToEmail_s2");
function addCopyToEmail_s2(&$arFields, &$arTemplate) {
$arFields['BCC'] = 's2_archive@mycompany.com';
}
Заключение
Многосайтовость в Битрикс — это мощный инструмент, основанный на простом принципе разделения по SITE_ID.
Правильно используя эту константу в настройках компонентов, фильтрах GetList и условной логике в шаблонах и init.php, вы можете построить гибкую и легко управляемую систему из множества сайтов на едином ядре.
многосайтовость Битрикс, несколько сайтов, SITE_ID, SITE_TEMPLATE_PATH, условия в шаблоне, разные инфоблоки, настройки сайта.