Указание IBLOCK_TYPE и IBLOCK_CODE при подключении компонентов

В решениях Симай при подключении компонентов обычно передаются параметры IBLOCK_TYPE и IBLOCK_CODE. Для баннеров это выглядит так:


$APPLICATION->IncludeComponent(
    'simai:sf.iblock.list',
    '',
    [
        'IBLOCK_TYPE' => 'sf_ru_banner',
        'IBLOCK_CODE' => 'sf-ru-banner-section',
        // ...
    ]
);

На первый взгляд может показаться логичным подставлять SITE_ID в эти значения:


// ТАК ДЕЛАТЬ НЕ НУЖНО !!!
'IBLOCK_TYPE' => 'sf_' . SITE_ID . '_banner',
'IBLOCK_CODE' => 'sf-' . SITE_ID . '-banner-section',

Однако в решениях Симай это специально не требуется. В исходном коде решений SITE_ID не подставляется, а вместо этого используется фиксированное значение ru:

  • тип инфоблока:sf_ru_banner;
  • символьный код инфоблока:sf-ru-banner-section.

И уже при установке и обновлении решения происходит автоматическая замена этих "заглушек" на реальные коды для конкретного сайта.

Как работает замена кодов при установке решения

При установке решения в мастере на одном из шагов (обработчик /simai/wizard/action/replace.code/) выполняется автоматическая подмена части:

  • _ru_ на _SITE_ID_;
  • -ru- на -SITE_ID-.

То есть, если в исходниках решения написано:


'IBLOCK_TYPE' => 'sf_ru_banner',
'IBLOCK_CODE' => 'sf-ru-banner-section',

а сайт устанавливается, например, с SITE_ID = 's1', то мастер установки:

  • в публичных файлах решения заменит sf_ru_banner на sf_s1_banner;
  • sf-ru-banner-section заменит на sf-s1-banner-section.

В результате в рабочем проекте коды уже будут корректно привязаны к конкретному сайту, хотя в исходном решении по-прежнему хранятся "универсальные" значения с ru.

Замена кодов при обновлении решения (updater.php)

Помимо установки, замена кодов инфоблоков выполняется и при обновлениях решения. В файле обновления updater.php используется вызов:


\SIMAI\Install\Import::replaceCode(
    $arSite["ABS_DOC_ROOT"] . $arSite["DIR"] . $filename . "/",
    $arSite["ID"]
);

Ключевые моменты:

  • метод \SIMAI\Install\Import::replaceCode() входит в либу simai.framework;
  • он рекурсивно проходит по указанной папке (обычно это публичная часть решения для конкретного сайта);
  • внутри файлов заменяет коды инфоблоков по тем же правилам, что и мастер установки (используя SITE_ID, переданный вторым параметром).

Таким образом:

  • при установке решения коды заменяются один раз мастером;
  • при обновлениях (через updater.php) тот же механизм следит, чтобы в публичке оставались актуальные коды, даже если структура решения изменилась.

Заключение

В публичном коде решений Симай для IBLOCK_TYPE и IBLOCK_CODE используйте фиксированные шаблоны с ru (sf_ru_*, sf-ru-*). Не подставляйте SITE_ID вручную. Корректные значения для конкретного сайта подставляются автоматически на шагах установки и обновления решения с помощью механизма replaceCode из simai.framework.