You are here

function opigno_learning_path_views_query_alter in Opigno Learning path 8

Same name and namespace in other branches
  1. 3.x opigno_learning_path.module \opigno_learning_path_views_query_alter()

Implements hook_views_query_alter().

File

./opigno_learning_path.module, line 2355
Contains opigno_learning_path.module.

Code

function opigno_learning_path_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {

  // Hide learning paths from catalog
  // for anonymous depending on the field value.
  if ($view
    ->id() == 'opigno_training_catalog' && Drupal::currentUser()
    ->isAnonymous()) {

    // Join the anonymous field table.
    $definition = [
      'table' => 'group__field_anonymous_visibility',
      'field' => 'entity_id',
      'left_table' => 'groups_field_data',
      'left_field' => 'id',
    ];
    $join = Drupal::service('plugin.manager.views.join')
      ->createInstance('standard', $definition);

    // Add relation and where condition.
    $query
      ->addRelationship('group__field_anonymous_visibility', $join, 'group__field_anonymous_visibility');
    $query->where[] = [
      'conditions' => [
        [
          'field' => 'group__field_anonymous_visibility.field_anonymous_visibility_value',
          'value' => 1,
          'operator' => '!=',
        ],
      ],
      'type' => 'AND',
    ];
  }
  if ($view
    ->id() === 'opigno_group_members') {
    $user = \Drupal::currentUser();
    if (!$user
      ->hasPermission('manage group members in any group')) {

      // If current user is not an admin and not a global user manager.
      // Get trainings where the current user is a user manager.

      /** @var \Drupal\group\GroupMembershipLoaderInterface $membership_service */
      $membership_service = \Drupal::service('group.membership_loader');
      $memberships = $membership_service
        ->loadByUser($user, [
        'learning_path-user_manager',
      ]);
      $groups_ids = array_map(function ($membership) {

        /** @var \Drupal\group\GroupMembership $membership */
        return $membership
          ->getGroup()
          ->id();
      }, $memberships);

      // Filter listed memberships by them.
      if (!empty($groups_ids)) {
        $query->where[] = [
          'conditions' => [
            [
              'field' => 'groups_field_data_group_content_field_data.id',
              'value' => $groups_ids,
              'operator' => 'IN',
            ],
          ],
          'type' => 'AND',
        ];
      }
      else {
        $query->where[] = [
          'conditions' => [
            [
              'field' => 'FALSE',
              'value' => [],
              'operator' => 'formula',
            ],
          ],
          'type' => 'AND',
        ];
      }
    }
  }
  if ($view
    ->id() === 'opigno_group_members_table') {

    // Add filter for only members of a training.

    /** @var \Drupal\group\Entity\Group $group */
    $group = \Drupal::routeMatch()
      ->getParameter('group');
    if ($group) {
      $members = $view->storage
        ->get('group_members');
      $members = !empty($members) ? $members : [
        0,
      ];
      $query->where[] = [
        'conditions' => [
          [
            'field' => 'group_content_field_data.entity_id',
            'value' => $members,
            'operator' => 'IN',
          ],
        ],
        'type' => 'AND',
      ];
    }
  }
}