function CommentSelection::entityQueryAlter

Same name and namespace in other branches
  1. 9 core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php \Drupal\comment\Plugin\EntityReferenceSelection\CommentSelection::entityQueryAlter()
  2. 8.9.x core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php \Drupal\comment\Plugin\EntityReferenceSelection\CommentSelection::entityQueryAlter()
  3. 10 core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php \Drupal\comment\Plugin\EntityReferenceSelection\CommentSelection::entityQueryAlter()

Overrides SelectionPluginBase::entityQueryAlter

File

core/modules/comment/src/Plugin/EntityReferenceSelection/CommentSelection.php, line 91

Class

CommentSelection
Provides specific access control for the comment entity type.

Namespace

Drupal\comment\Plugin\EntityReferenceSelection

Code

public function entityQueryAlter(SelectInterface $query) {
    parent::entityQueryAlter($query);
    $tables = $query->getTables();
    $data_table = 'comment_field_data';
    if (!isset($tables['comment_field_data']['alias'])) {
        // If no conditions join against the comment data table, it should be
        // joined manually to allow node access processing.
        $query->innerJoin($data_table, NULL, "[base_table].[cid] = [{$data_table}].[cid] AND [{$data_table}].[default_langcode] = 1");
    }
    // Historically, comments were always linked to 'node' entities, but that is
    // no longer the case, as the 'node' module might not even be enabled.
    // Comments can now be linked to any entity and they can also be referenced
    // by other entities, so we won't have a single table to join to. That
    // actually means that we can no longer optimize the query on those cases.
    // However, the most common case remains to be comment replies, and in this
    // case, we can get the host entity type if the 'entity' value is present
    // and perform the extra joins and alterations needed.
    $comment = $this->getConfiguration()['entity'];
    if ($comment instanceof CommentInterface) {
        $host_entity_type_id = $comment->getCommentedEntityTypeId();
        
        /** @var \Drupal\Core\Entity\EntityTypeInterface $host_entity_type */
        $host_entity_type = $this->entityTypeManager
            ->getDefinition($host_entity_type_id);
        $host_entity_field_data_table = $host_entity_type->getDataTable();
        // Not all entities have a data table, so check first.
        if ($host_entity_field_data_table) {
            $id_key = $host_entity_type->getKey('id');
            // The Comment module doesn't implement per-comment access, so it
            // checks instead that the user has access to the host entity.
            $entity_alias = $query->innerJoin($host_entity_field_data_table, 'n', "[%alias].[{$id_key}] = [{$data_table}].[entity_id] AND [{$data_table}].[entity_type] = '{$host_entity_type_id}'");
            // Pass the query to the entity access control.
            $this->reAlterQuery($query, $host_entity_type_id . '_access', $entity_alias);
            // Additional checks for "node" entities.
            if ($host_entity_type_id === 'node') {
                // Passing the query to node_query_node_access_alter() is sadly
                // insufficient for nodes.
                // @see \Drupal\node\Plugin\EntityReferenceSelection\NodeSelection::buildEntityQuery()
                if (!$this->currentUser
                    ->hasPermission('bypass node access') && !$this->moduleHandler
                    ->hasImplementations('node_grants')) {
                    $query->condition($entity_alias . '.status', 1);
                }
            }
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.