Классы CSite и CLang дают программный
доступ к настройкам сайтов и языков установки — той же информации,
что видна в административной панели через карточки сайтов
и языковые настройки. Разберём их основные методы и типичные
сценарии использования.
Получение информации о текущем сайте
<?php
$siteId = SITE_ID;
$site = CSite::GetByID($siteId)->Fetch();
echo $site['NAME'];
echo $site['SERVER_NAME'];
echo $site['EMAIL'];
Константа SITE_ID доступна в контексте выполнения
любого запроса — она определяется ядром на основе того, к какому
сайту относится текущий домен запроса. CSite::GetByID
даёт полный набор настроек этого сайта: домен, email отправителя,
язык по умолчанию и другие параметры карточки сайта.
Получение списка всех сайтов установки
<?php
$result = CSite::GetList('SORT', 'ASC', ['ACTIVE' => 'Y']);
while ($site = $result->Fetch()) {
echo $site['LID'] . ': ' . $site['NAME'] . ' (' . $site['SERVER_NAME'] . ')' . PHP_EOL;
}
Для мультисайтовых установок этот вызов полезен в сценариях вроде переключателя языковых версий в шапке сайта или административных скриптов, обрабатывающих данные сразу по всем сайтам установки в цикле.
Нужна помощь с Битрикс?
Работа с языками через CLang
<?php
$result = CLang::GetList('SORT', 'ASC', ['ACTIVE' => 'Y']);
while ($lang = $result->Fetch()) {
echo $lang['LID'] . ': ' . $lang['NAME'] . ' (' . $lang['CHARSET'] . ')' . PHP_EOL;
}
Языки в терминах старого API Битрикса исторически смешаны
с понятием сайта — LID одновременно служит и кодом
языка, и кодом сайта в классической схеме, что для новичков
часто становится источником путаницы, поскольку в современных
проектах один язык не всегда означает один физический сайт.
Определение текущего языка интерфейса
<?php
global $LANGUAGE_ID;
echo $LANGUAGE_ID; // 'ru', 'en' и так далее
$currentLang = CLang::GetByID($LANGUAGE_ID)->Fetch();
echo $currentLang['FORMAT_DATE']; // формат даты для текущего языка
Глобальная переменная $LANGUAGE_ID — быстрый способ
узнать текущий язык без дополнительного обращения к базе, тогда
как CLang::GetByID нужен, когда требуются
дополнительные настройки языка помимо самого кода — например,
формат даты или разделитель для чисел, специфичный для конкретной
локали.
Программное создание нового сайта
<?php
$site = new CSite;
$siteId = $site->Add([
'LID' => 's2',
'NAME' => 'Английская версия',
'DIR' => '/en/',
'SERVER_NAME' => 'en.example.ru',
'DEF_TEMPLATE' => 'main_en',
'ACTIVE' => 'Y',
]);
Программное создание сайта полезно при автоматизированном развёртывании однотипных проектов — например, если процесс запуска нового регионального сайта на той же установке стандартизирован и повторяется регулярно, скрипт избавляет от ручного повторения одинаковых шагов через административную панель каждый раз.
Отличие CSite от Bitrix\Main\SiteTable
Как и многие классы старого API, CSite имеет
современный D7-аналог — Bitrix\Main\SiteTable —
с ORM-интерфейсом выборки. Для нового кода, особенно если он уже
написан в стиле D7, предпочтительнее использовать именно
D7-вариант, тогда как CSite остаётся рабочим
и совместимым выбором для проектов, ориентированных на старый API.
Частые ошибки
- Путаница между LID языка и LID сайта в мультисайтовой установке. Исторически они могут совпадать не один в один, особенно на нестандартной структуре сайтов.
- Формат даты жёстко захардкожен в коде вместо использования формата текущего языка. Ломается при добавлении новой языковой версии сайта с другим форматом.
Итог
CSite и CLang дают программный доступ
к настройкам сайтов и языков установки — от домена и email
отправителя до формата даты локали. Для новых мультисайтовых
и мультиязычных проектов, особенно написанных в стиле D7, стоит
учитывать современный аналог Bitrix\Main\SiteTable
как альтернативу этому старому API.
