При необходимости не показывать отдельные разделы или элементы информационных блоков на сайте на определенных доменах (филиалах) необходимо произвести (для примера) следующие действия:
- создать у разделов инфоблока (или у элементов инфоблока) свойство с типом Ammina.Regions: Домен, сделав его множественным и назвать, например, «Не показывать на доменах»
- в файле init.php реализовать функцию, которая будет либо возвращать список разделов, которые не должны быть видны на текущем домене, либо проверять, относится ли раздел к скрываемым на данном домене, либо проверять, является ли элемент скрываемым на данном домене. Пример функции 1-го типа приведен ниже.
- произвести изменения в коде в соответствии с логикой стоящей для реализации задачи.
- если на сайте используется кэширование, то рекомендуется у всех компонентов, которые выводят динамические данные, зависимые от домена, добавить параметр "ARG_DOMAIN_ID" => $GLOBALS['AMMINA_REGIONS']['SYS_CURRENT_DOMAIN_ID']
- в некоторых случаях может понадобится незначительная кастомизация некоторых стандартных компонентов. Чаще всего это будет выражаться в добавлении ключа кэширования в компоненте для разделения кэша по доменам, либо в изменении условий фильтрации.
- в приложении к данной документации приведены архивы файлов шаблонов, кастомизированных компонентов, файла init.php, которые используются на нашем демонстрационном сайте https://www.ammina-demo.ru/
Пример функции, возвращающей список разделов, которые не будут выводиться на определенном домене:
function _getNotViewDomainSections($IBLOCK_ID, $PROPERTY_CODE, $DOMAIN_ID)
{
$arResult = array();
$obCache = new CPHPCache();
if ($obCache->InitCache(36000, $IBLOCK_ID . "|" . $PROPERTY_CODE . "|" . $DOMAIN_ID, "/ammina/domain/sections/notview")) {
$arResult = $obCache->GetVars();
} elseif ($obCache->StartDataCache()) {
if (\Bitrix\Main\Loader::includeModule("iblock")) {
$rSections = CIBlockSection::GetList(array("left_margin" => "ASC"), array("IBLOCK_ID" => $IBLOCK_ID), false, array($PROPERTY_CODE));
$depthLevelNotView = 0;
$notViewChild = false;
while ($arSection = $rSections->Fetch()) {
if ($notViewChild) {
if ($arSection['DEPTH_LEVEL'] <= $depthLevelNotView) {
$notViewChild = false;
$depthLevelNotView = 0;
} else {
$arResult[] = $arSection['ID'];
}
}
if ((!is_array($arSection[$PROPERTY_CODE]) && $arSection[$PROPERTY_CODE] == $DOMAIN_ID) || (is_array($arSection[$PROPERTY_CODE]) && in_array($DOMAIN_ID, $arSection[$PROPERTY_CODE]))) {
if (!$notViewChild) {
$notViewChild = true;
$depthLevelNotView = $arSection['DEPTH_LEVEL'];
$arResult[] = $arSection['ID'];
}
}
}
}
$obCache->EndDataCache($arResult);
}
return $arResult;
}
Пример вызова функции для текущего домена:
$ARG_HIDE_SECTIONS = _getNotViewDomainSections($arParams['IBLOCK_ID'], "UF_NOT_SHOW_DOMAIN", $GLOBALS['AMMINA_REGIONS']['SYS_CURRENT_DOMAIN_ID']);