You are here

public function FlexibleGroupNodeAccess::query in Open Social 8.8

Same name and namespace in other branches
  1. 8.9 modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php \Drupal\social_group_flexible_group\Plugin\views\filter\FlexibleGroupNodeAccess::query()
  2. 8.7 modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php \Drupal\social_group_flexible_group\Plugin\views\filter\FlexibleGroupNodeAccess::query()
  3. 10.3.x modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php \Drupal\social_group_flexible_group\Plugin\views\filter\FlexibleGroupNodeAccess::query()
  4. 10.0.x modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php \Drupal\social_group_flexible_group\Plugin\views\filter\FlexibleGroupNodeAccess::query()
  5. 10.1.x modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php \Drupal\social_group_flexible_group\Plugin\views\filter\FlexibleGroupNodeAccess::query()
  6. 10.2.x modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php \Drupal\social_group_flexible_group\Plugin\views\filter\FlexibleGroupNodeAccess::query()

See _node_access_where_sql() for a non-views query based implementation.

Overrides FilterPluginBase::query

File

modules/social_features/social_group/modules/social_group_flexible_group/src/Plugin/views/filter/FlexibleGroupNodeAccess.php, line 33

Class

FlexibleGroupNodeAccess
Filter by node access based on Group membership.

Namespace

Drupal\social_group_flexible_group\Plugin\views\filter

Code

public function query() {
  $account = $this->view
    ->getUser();
  $group_access = NULL;
  if (!$account
    ->hasPermission('administer nodes') && !$account
    ->hasPermission('bypass node access')) {

    // Ensure we check for group content.
    // Join node table(s).
    $configuration = [
      'left_table' => 'node_field_data',
      'left_field' => 'nid',
      'table' => 'group_content_field_data',
      'field' => 'entity_id',
      'operator' => '=',
    ];
    $join = Views::pluginManager('join')
      ->createInstance('standard', $configuration);
    $this->query
      ->addRelationship('membership', $join, 'node_field_data');

    // Add extra condition for Group Membership
    // related check in Flexible groups.
    $group_memberships = \Drupal::service('social_group.helper_service')
      ->getAllGroupsForUser($account
      ->id());
    if (!empty($group_memberships) && !$account
      ->isAnonymous()) {

      // OR content is GROUP.
      $group_access = new Condition('OR');
      $group_access
        ->condition('membership.gid', $group_memberships, 'IN');
    }

    // Also check for Open / Public within groups.
    $configuration = [
      'left_table' => 'node_field_data',
      'left_field' => 'nid',
      'table' => 'node__field_content_visibility',
      'field' => 'entity_id',
      'operator' => '=',
    ];
    $join = Views::pluginManager('join')
      ->createInstance('standard', $configuration);
    $this->query
      ->addRelationship('field_visibility_relationship', $join, 'node__field_content_visibility');
    $group_visible = new Condition('OR');
    $group_visible
      ->condition('field_content_visibility_value', 'public');
    if (!$account
      ->isAnonymous()) {
      $group_visible
        ->condition('field_content_visibility_value', 'community');
    }
    if ($group_access !== NULL) {
      $group_visible
        ->condition($group_access);
    }

    // And we should check for open / public.
    $this->query
      ->addWhere('visibility', $group_visible);
  }
}