1С-Битрикс: Управление сайтом 18.5.180
В инфоблоке установлено Расширенное управление правами
Все посетители -> Чтение
Группа Администраторы -> Полный доступ
Струтура:
Раздел
-----> Подраздел
----------> Элемент
-----> Подраздел
Задача ограничить для определенных пользователей доступ к определенным элементам или разделам.
Если выставить ограничение для пользователя входящего либо в Все посетители или Группа Администраторы на раздел (Нет доступа) то пользователь все равно видит данный раздел и может туда попасть.
Использую компонент bitrix:news.list с дополнением, в result_modifier.php используются следующие запросы:[CODE]unset($arResult['SECTION'], $arResult['ITEMS'], $arResult['ELEMENTS']);
global $arrFilter, $USER;
$arSections = [];
$arElements = [];
if ($arParams['ADD_SECTIONS_CHAIN'] && !empty($arResult['NAME'])) {
$rsNav = CIBlockSection::GetNavChain($arParams['IBLOCK_ID'], $arParams['SECTION_ID']);
while ($arNav = $rsNav->GetNext()) {
$arResult['SECTION']['PATH'][] = $arNav;
}
}
$arSectionFilter = [
'ACTIVE' => 'Y',
'GLOBAL_ACTIVE' => 'Y',
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'CHECK_PERMISSIONS' => 'Y',
'PERMISSIONS_BY' => $USER->GetID()
];
$arElementFilter = [
'ACTIVE' => 'Y',
'IBLOCK_ID' => $arParams['IBLOCK_ID'],
'CHECK_PERMISSIONS' => 'Y',
'PERMISSIONS_BY' => $USER->GetID()
];
if (empty($arParams['SECTION_ID'])) {
$arSectionFilter['DEPTH_LEVEL'] = '1';
} elseif (!empty($arParams['SECTION_ID'])) {
$arSectionFilter['SECTION_ID'] = $arParams['SECTION_ID'];
$arElementFilter['IBLOCK_SECTION_ID'] = $arParams['SECTION_ID'];
}
$arSort = [
'name' => 'asc',
'sort' => 'asc'
];
$arSectionSelect = [
'ID',
'CODE',
'NAME',
'SORT',
'ACTIVE',
'IBLOCK_ID',
'IBLOCK_SECTION_ID',
'SECTION_PAGE_URL',
'LEFT_MARGIN',
'RIGHT_MARGIN',
'DEPTH_LEVEL',
'TIMESTAMP_X',
'MODIFIED_BY',
];
$arElementSelect = [
'ID',
'CODE',
'NAME',
'SORT',
'ACTIVE',
'IBLOCK_ID',
'IBLOCK_SECTION_ID',
'LIST_PAGE_URL',
'DETAIL_PAGE_URL',
'TIMESTAMP_X',
'MODIFIED_BY',
'PROPERTY_FILE'
];
$arNavParams = [
'nPageSize' => 30
];
$rsSections = CIBlockSection::GetList($arSort, array_merge($arSectionFilter, $arrFilter), false, $arSectionSelect, false);
while ($arSection = $rsSections->GetNext()) {
$arSection['SECTION'] = 'Y';
$arSections[] = $arSection;
}
if (!empty($arParams['SECTION_ID'])) {
$rsElements = CIBlockElement::GetList($arSort, array_merge($arElementFilter, $arrFilter), false, false, $arElementSelect);
while ($arElement = $rsElements->GetNext()) {
$arElement['SECTION'] = 'N';
$arElement['DETAIL_PAGE_URL'] = $arElement['PROPERTY_FILE_VALUE'];
if (preg_match('/.*\.(pdf)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'pdf';
} elseif (preg_match('/.*\.(docx|doc)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'doc';
} elseif (preg_match('/.*\.(xlsx|xls)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'xls';
} elseif (preg_match('/.*\.(pptx|ppt)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'ppt';
} elseif (preg_match('/.*\.(html|htm)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'html';
} elseif (preg_match('/.*\.(jpg|jpeg|png|bmp|gif)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'image';
} elseif (preg_match('/.*\.(mp4)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'video';
} elseif (preg_match('/.*\.(msg)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'mail';
} elseif (preg_match('/.*\.(xml)$/iu', $arElement['PROPERTY_FILE_VALUE'])) {
$arElement['EXTENSION'] = 'xml';
} else {
$arElement['EXTENSION'] = 'empty';
}
$arElements[] = $arElement;
}
}
$arResult['SECTIONS'] = $arSections;
$arResult['ELEMENTS'] = $arElements;
$arResult['ITEMS'] = array_merge($arSections, $arElements);
unset($arSections, $arElements);
$arResult['SECTIONS_COUNT'] = count($arResult['SECTIONS']);
$arResult['ELEMENTS_COUNT'] = count($arResult['ELEMENTS']);
$arResult['TOTAL_COUNT'] = count($arResult['ITEMS']);
[/CODE]
Далее уже в template.php отображаю структуру разделов и входящих в них элементов.
Если Все посетители -> Нет доступа и конкретный пользователь -> Чтение на инфоблок и на определенные разделы выбирать конкретного пользователя и разрешать смотреть, то работает как нужно
Это не решение, так как проблема в 3 тысячах пользователях и 700+ групп
Заметил что общие правила доступа приоритетнее частных правил.
При выборке пробовал использовать:
[CODE]CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, $permission);
CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, $permission);[/CODE]
Но данные методы всегда возвращают 1, не важно стоит частное ограничение или нет, основываются результаты на общих правилах.
Внимание знатоки, вопрос:
Как правильно назначить частные правила доступа на разделы и элементы конкретным пользователям и группам? чтобы данные разделы или не присутствовали в выборке или у данных разделов были пометки о том, что доступ к ним ограничен для данного пользователя или группе.