Указание 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.