function social_group_secret_views_query_alter in Open Social 10.3.x
Same name and namespace in other branches
- 8.9 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
- 8.6 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
- 8.7 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
- 8.8 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
- 10.0.x modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
- 10.1.x modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
- 10.2.x modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
Implements hook_views_query_alter().
Hide secret groups everywhere when the current user is not a member.
File
- modules/
social_features/ social_group/ modules/ social_group_secret/ social_group_secret.module, line 51 - The Social group secret module.
Code
function social_group_secret_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
if (empty($view->rowPlugin) || !$view->rowPlugin instanceof EntityRow || $view->rowPlugin
->getEntityTypeId() !== 'group') {
return;
}
$account = \Drupal::currentUser();
if (social_group_secret_can_view_secret_groups($account)) {
return;
}
/** @var \Drupal\group\GroupMembershipLoaderInterface $service */
$service = \Drupal::service('group.membership_loader');
// Define the list of the secret groups where the current user is a member.
// It's needed because the user should see only secret groups where it is a
// member.
$ids = [];
/** @var \Drupal\group\GroupMembership $membership */
foreach ($service
->loadByUser($account) as $membership) {
if ($membership
->getGroup()
->bundle() === 'secret_group') {
$ids[] = $membership
->getGroup()
->id();
}
}
/** @var \Drupal\views\Plugin\views\query\Sql $query */
$group = count($query->where);
while (isset($query->where[$group])) {
$group++;
}
if ($ids) {
$ids = \Drupal::entityTypeManager()
->getStorage('group')
->getQuery()
->condition('type', 'secret_group')
->condition('id', $ids, 'NOT IN')
->execute();
if ($ids) {
$query
->addWhere($group, 'groups_field_data.id', $ids, 'NOT IN');
}
}
else {
// Add context so for AN it will have a different cache.
$view->element['#cache']['contexts'][] = 'user.roles:anonymous';
$query
->addWhere($group, 'groups_field_data.type', [
'secret_group',
], 'NOT IN');
}
}