Чуть выше мы отметили, что код исключения «закрытых» пользователей вынесен в конец компонента. Теперь пришло время определить пользователей, которые запретили просмотр блогов. Уберем их из списка (раз уж они сами этого захотели). Здесь надо обратить внимание на две дополнительные функции, которые не входят в стандартный API ядра «1С-Битрис: Управления сайтом»: CPTK_SocialNetwork:: GetByRoleFeaturesIdArray() и CPTK_SocialNetwork:: IsAllowedFeature(). Они представляют собой часть библиотеки автора, их текст здесь не приводится (библиотеку можно запросить у автора статьи). Первая, CPTK_SocialNetwork:: GetByRoleFeaturesIdArray(),возвращает массив идентификаторов объектов по типу объекта, сигнатуре, функциональности и операциям (с возможностью установки дополнительного фильтра). Функция имеет внутреннее кэширование результатов, в ее основе лежит метод CSocNetFeaturesPerms::GetList(). Вторая, CPTK_SocialNetwork:: IsAllowedFeature(), проверяет доступна ли для заданного объекта затребованная функциональность.
if(!empty($arEntityUsersID)) {
$arExceptUserEntity = CPTK_SocialNetwork::GetByRoleFeaturesIdArray(SONET_ENTITY_USER, 'blog', 'view_post', array('!ROLE' => SONET_RELATIONS_TYPE_ALL), array('!ROLE' => SONET_RELATIONS_TYPE_ALL));
$arTmp = array_intersect_key($arExceptUserEntity, $arEntityUsersID);
unset($arExceptUserEntity);
if(!empty($arTmp)) {
foreach($arTmp as $key)
{
unset($arEntityUsersID[$key]);
}
}
unset($arTmp);
//если активный пользователь является владельцем ленты повторно включим его ID, даже если он закрыл свой блог – ему заведомо можно просматривать свои записи
if($arParams['INC_SELF_MESSAGES'] && $arResult['CURRENT_ACCSESS']['canViewUserSelfMessages']) {
$arEntityUsersID[$arResult['ENTITY_ID']] = $arResult['ENTITY_ID'];
}
//Определим пользователей, которые вообще отключили свои блоги и исключим их из списка
$arExceptUserEntity = CPTK_SocialNetwork::GetByRoleFeaturesIdArray(SONET_ENTITY_USER, 'blog', 'view_post', array('FEATURE_ACTIVE' => 'N'), array('FEATURE_ACTIVE' => 'N'));
$arTmp = array_intersect_key($arExceptUserEntity, $arEntityUsersID);
unset($arExceptUserEntity);
if(!empty($arTmp)) {
foreach($arTmp as $key) {
unset($arEntityUsersID[$key]);
}
}
unset($arTmp);
}
Применение дополнительных функций — по сути, небольшая оптимизация часто выполняемой операции, более или менее опытному разработчику не составит труда реализовать ее самостоятельно.