View source
<?php
namespace Drupal\activity_viewer\Plugin\views\filter;
use Drupal\views\Plugin\views\filter\FilterPluginBase;
use Drupal\views\Views;
class ActivityPostVisibilityAccess extends FilterPluginBase {
public function canExpose() {
return FALSE;
}
public function query() {
$account = $this->view
->getUser();
$open_groups = [];
$group_memberships = [];
if (\Drupal::moduleHandler()
->moduleExists('social_group')) {
$open_groups = social_group_get_all_open_groups();
$group_memberships = social_group_get_all_group_members($account
->id());
}
$groups = array_merge($open_groups, $group_memberships);
$groups_unique = array_unique($groups);
$this->query
->addTable('activity__field_activity_recipient_group');
$this->query
->addTable('activity__field_activity_entity');
$configuration = [
'left_table' => 'activity__field_activity_entity',
'left_field' => 'field_activity_entity_target_id',
'table' => 'post_field_data',
'field' => 'id',
'operator' => '=',
'extra' => [
0 => [
'left_field' => 'field_activity_entity_target_type',
'value' => 'post',
],
],
];
$join = Views::pluginManager('join')
->createInstance('standard', $configuration);
$this->query
->addRelationship('post', $join, 'activity__field_activity_entity');
$configuration = [
'left_table' => 'post',
'left_field' => 'id',
'table' => 'post__field_visibility',
'field' => 'entity_id',
'operator' => '=',
];
$join = Views::pluginManager('join')
->createInstance('standard', $configuration);
$this->query
->addRelationship('post__field_visibility', $join, 'post__field_visibility');
$configuration = [
'left_table' => 'activity__field_activity_entity',
'left_field' => 'field_activity_entity_target_id',
'table' => 'node_access',
'field' => 'nid',
'operator' => '=',
'extra' => [
0 => [
'left_field' => 'field_activity_entity_target_type',
'value' => 'node',
],
],
];
$join = Views::pluginManager('join')
->createInstance('standard', $configuration);
$this->query
->addRelationship('node_access', $join, 'node_access_relationship');
if ($account
->isAnonymous()) {
$configuration['table'] = 'node_field_data';
$join = Views::pluginManager('join')
->createInstance('standard', $configuration);
$this->query
->addRelationship('node_field_data', $join, 'node_field_data');
}
$and_wrapper = db_and();
$or = db_or();
$node_access = db_and();
$node_access
->condition('activity__field_activity_entity.field_activity_entity_target_type', 'node', '=');
$node_access_grants = node_access_grants('view', $account);
$grants = db_or();
foreach ($node_access_grants as $realm => $gids) {
if (!empty($gids)) {
$and = db_and();
if ($account
->isAnonymous() && strpos($realm, 'field_content_visibility_community') !== FALSE) {
$and
->condition('node_field_data.uid', 0, '!=');
}
$grants
->condition($and
->condition('node_access.gid', $gids, 'IN')
->condition('node_access.realm', $realm));
}
}
$node_access
->condition($grants);
$or
->condition($node_access);
if ($account
->isAuthenticated() && count($groups_unique) > 0) {
$posts_in_groups = db_and();
$posts_in_groups
->condition('activity__field_activity_entity.field_activity_entity_target_type', 'post', '=');
$posts_in_groups
->condition('activity__field_activity_recipient_group.field_activity_recipient_group_target_id', $groups_unique, 'IN');
$or
->condition($posts_in_groups);
}
$post_access = db_and();
$post_access
->condition('activity__field_activity_entity.field_activity_entity_target_type', 'post', '=');
$post_access
->condition('post__field_visibility.field_visibility_value', '3', '!=');
if (!$account
->hasPermission('view public posts')) {
$post_access
->condition('post__field_visibility.field_visibility_value', '1', '!=');
}
if (!$account
->hasPermission('view community posts')) {
$post_access
->condition('post__field_visibility.field_visibility_value', '2', '!=');
$post_access
->condition('post__field_visibility.field_visibility_value', '0', '!=');
}
$or
->condition($post_access);
$post_status = db_or();
$post_status
->condition('post.status', 1, '=');
if ($account
->hasPermission('view unpublished post entities')) {
$post_status
->condition('post.status', 0, '=');
}
$post_status
->condition('activity__field_activity_entity.field_activity_entity_target_type', 'post', '!=');
$and_wrapper
->condition($post_status);
if ($account
->hasPermission('access comments')) {
if (count($groups_unique) > 0) {
$comments_on_content_in_groups = db_and();
$comments_on_content_in_groups
->condition('activity__field_activity_entity.field_activity_entity_target_type', 'comment', '=');
$comments_on_content_in_groups
->condition('activity__field_activity_recipient_group.field_activity_recipient_group_target_id', $groups_unique, 'IN');
$or
->condition($comments_on_content_in_groups);
}
$comments_on_content = db_and();
$comments_on_content
->condition('activity__field_activity_entity.field_activity_entity_target_type', 'comment', '=');
$comments_on_content
->isNull('activity__field_activity_recipient_group.field_activity_recipient_group_target_id');
$or
->condition($comments_on_content);
}
$and_wrapper
->condition($or);
$this->query
->addWhere('visibility', $and_wrapper);
}
}