Главная » API Битрикс » Прочее » CSite и CLang — сайты и языки из кода в Битрикс

CSite и CLang — сайты и языки из кода в Битрикс

Схема программного доступа к настройкам сайтов и языков через CSite и CLang в 1С-Битрикс

Классы 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.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний