You are here

public function ActivityFilterPersonalisedHomepage::query in Open Social 10.2.x

Same name and namespace in other branches
  1. 8.9 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  2. 8 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  3. 8.2 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  4. 8.3 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  5. 8.4 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  6. 8.5 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  7. 8.6 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  8. 8.7 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  9. 8.8 modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  10. 10.3.x modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  11. 10.0.x modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()
  12. 10.1.x modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php \Drupal\activity_viewer\Plugin\views\filter\ActivityFilterPersonalisedHomepage::query()

Filters out activity items the user is not allowed to see.

The access to the activity items may be limited by the following: 1. Value in field_visibility_value on a Post entity. 2. Node access grants (this includes the field_node_visibility_value and the nodes in a closed group) 3. The comment or post is posted in a (closed) group.

In addition to the condition used in this filter there may be some other filters active in the given view (e.g. destination).

Probably want to extend this to entity access based on the node grant system when this is implemented. See https://www.drupal.org/node/777578

Overrides FilterPluginBase::query

File

modules/custom/activity_viewer/src/Plugin/views/filter/ActivityFilterPersonalisedHomepage.php, line 109

Class

ActivityFilterPersonalisedHomepage
Filters activity for a personalised homepage.

Namespace

Drupal\activity_viewer\Plugin\views\filter

Code

public function query() {
  $account = $this->view
    ->getUser();
  $skip_roles = [
    'administrator',
    'contentmanager',
    'sitemanager',
  ];
  $hide_from_view = $nids = $pids = $cids = [];

  // Skip filter for users that have full access to the site content.
  if (!empty(array_intersect($skip_roles, $account
    ->getRoles()))) {
    return;
  }
  $this
    ->ensureMyTable();
  $group_memberships = $this->groupHelper
    ->getAllGroupsForUser($account
    ->id());

  /** @var \Drupal\views\Plugin\views\query\Sql $filter_query */
  $filter_query = $this->query;
  $filter_query
    ->addTable('activity__field_activity_entity');
  $filter_query
    ->addTable('activity__field_activity_recipient_group');
  $filter_query
    ->addTable('activity__field_activity_recipient_user');

  // Add queries.
  $and_wrapper = new Condition('AND');
  $or = new Condition('OR');

  // Nodes: retrieve all the nodes to which the user has access.
  if ($account
    ->hasPermission('access content')) {
    $nids = $this
      ->getAvailableNodeIds($account, $group_memberships);
    if (!empty($nids)) {
      $node_access = $or
        ->andConditionGroup()
        ->condition('activity__field_activity_entity.field_activity_entity_target_type', 'node')
        ->condition('activity__field_activity_entity.field_activity_entity_target_id', $nids, 'IN');
      $or
        ->condition($node_access);
    }
    else {
      $hide_from_view[] = 'node';
    }
  }

  // Posts: retrieve all the posts to which the user has access.
  $pids = $this
    ->getAvailablePostIds($account, $group_memberships);
  if (!empty($pids)) {
    $post_access = $or
      ->andConditionGroup()
      ->condition('activity__field_activity_entity.field_activity_entity_target_type', 'post')
      ->condition('activity__field_activity_entity.field_activity_entity_target_id', $pids, 'IN');
    $or
      ->condition($post_access);
  }
  else {
    $hide_from_view[] = 'post';
  }

  // Comments: retrieve comments the user has access to.
  if ($account
    ->hasPermission('access comments')) {
    $cids = $this
      ->getAvailableCommentIds($nids, $pids);
    if (!empty($cids)) {
      $comments_access = $or
        ->andConditionGroup()
        ->condition('activity__field_activity_entity.field_activity_entity_target_type', 'comment')
        ->condition('activity__field_activity_entity.field_activity_entity_target_id', $cids, 'IN');
      $or
        ->condition($comments_access);
    }
    else {
      $hide_from_view[] = 'comment';
    }
  }
  if (!empty($hide_from_view)) {
    $and_wrapper
      ->condition('activity__field_activity_entity.field_activity_entity_target_type', $hide_from_view, 'NOT IN');
  }

  // Lets add all the or conditions to the Views query.
  if (!empty($or
    ->conditions()[0])) {
    $and_wrapper
      ->condition($or);
  }

  // Only activities which don't have direct user and group.
  if ($account
    ->isAnonymous()) {
    $an_access = new Condition('AND');
    $an_user_target = new Condition('OR');
    $an_user_target
      ->condition('activity__field_activity_recipient_user.field_activity_recipient_user_target_id', '0');
    $an_user_target
      ->isNull('activity__field_activity_recipient_user.field_activity_recipient_user_target_id');
    $an_access
      ->condition($an_user_target);
    $an_access
      ->isNull('activity__field_activity_recipient_group.field_activity_recipient_group_target_id');
    $and_wrapper
      ->condition($an_access);
  }
  else {

    // Only activities which targeted to current user.
    $lu_access = new Condition('AND');
    $lu_user_target = new Condition('OR');
    $lu_user_target
      ->condition('activity__field_activity_recipient_user.field_activity_recipient_user_target_id', (string) $account
      ->id());
    $lu_user_target
      ->isNull('activity__field_activity_recipient_user.field_activity_recipient_user_target_id');
    $lu_access
      ->condition($lu_user_target);

    // Only activities which targeted to current user's groups.
    $lu_group_target = new Condition('OR');
    if (!empty($group_memberships)) {
      $lu_group_target
        ->condition('activity__field_activity_recipient_group.field_activity_recipient_group_target_id', $group_memberships, 'IN');
    }
    $lu_group_target
      ->isNull('activity__field_activity_recipient_group.field_activity_recipient_group_target_id');
    $lu_access
      ->condition($lu_group_target);
    $and_wrapper
      ->condition($lu_access);
  }
  if (!empty($and_wrapper
    ->conditions()[0])) {
    $filter_query
      ->addWhere('visibility', $and_wrapper);
  }
}