36  /  57

Ограничение видимости по доменам разделов и элементов информационных блоков

При необходимости не показывать отдельные разделы или элементы информационных блоков на сайте на определенных доменах (филиалах) необходимо произвести (для примера) следующие действия:

  • создать у разделов инфоблока (или у элементов инфоблока) свойство с типом 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']);