You are here

function social_group_secret_views_query_alter in Open Social 10.3.x

Same name and namespace in other branches
  1. 8.9 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
  2. 8.6 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
  3. 8.7 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
  4. 8.8 modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
  5. 10.0.x modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
  6. 10.1.x modules/social_features/social_group/modules/social_group_secret/social_group_secret.module \social_group_secret_views_query_alter()
  7. 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');
  }
}