function CommentViewBuilder::buildComponents

Same name in other branches
  1. 9 core/modules/comment/src/CommentViewBuilder.php \Drupal\comment\CommentViewBuilder::buildComponents()
  2. 8.9.x core/modules/comment/src/CommentViewBuilder.php \Drupal\comment\CommentViewBuilder::buildComponents()
  3. 11.x core/modules/comment/src/CommentViewBuilder.php \Drupal\comment\CommentViewBuilder::buildComponents()

In addition to modifying the content key on entities, this implementation will also set the comment entity key which all comments carry.

Throws

\InvalidArgumentException Thrown when a comment is attached to an entity that no longer exists.

Overrides EntityViewBuilder::buildComponents

File

core/modules/comment/src/CommentViewBuilder.php, line 106

Class

CommentViewBuilder
View builder handler for comments.

Namespace

Drupal\comment

Code

public function buildComponents(array &$build, array $entities, array $displays, $view_mode) {
    
    /** @var \Drupal\comment\CommentInterface[] $entities */
    if (empty($entities)) {
        return;
    }
    // Pre-load associated users into cache to leverage multiple loading.
    $uids = [];
    foreach ($entities as $entity) {
        $uids[] = $entity->getOwnerId();
    }
    $this->entityTypeManager
        ->getStorage('user')
        ->loadMultiple(array_unique($uids));
    parent::buildComponents($build, $entities, $displays, $view_mode);
    // A counter to track the indentation level.
    $current_indent = 0;
    $attach_history = $this->moduleHandler
        ->moduleExists('history') && $this->currentUser
        ->isAuthenticated();
    foreach ($entities as $id => $entity) {
        if ($build[$id]['#comment_threaded']) {
            $comment_indent = count(explode('.', (string) $entity->getThread())) - 1;
            if ($comment_indent > $current_indent) {
                // Set 1 to indent this comment from the previous one (its parent).
                // Set only one extra level of indenting even if the difference in
                // depth is higher.
                $build[$id]['#comment_indent'] = 1;
                $current_indent++;
            }
            else {
                // Set zero if this comment is on the same level as the previous one
                // or negative value to point an amount indents to close.
                $build[$id]['#comment_indent'] = $comment_indent - $current_indent;
                $current_indent = $comment_indent;
            }
        }
        // Commented entities already loaded after self::getBuildDefaults().
        $commented_entity = $entity->getCommentedEntity();
        // Set defaults if the commented_entity does not exist.
        $bundle = $commented_entity ? $commented_entity->bundle() : '';
        $is_node = $commented_entity ? $commented_entity->getEntityTypeId() === 'node' : NULL;
        $build[$id]['#entity'] = $entity;
        $build[$id]['#theme'] = 'comment__' . $entity->getFieldName() . '__' . $bundle;
        $display = $displays[$entity->bundle()];
        if ($display->getComponent('links')) {
            $build[$id]['links'] = [
                '#lazy_builder' => [
                    'comment.lazy_builders:renderLinks',
                    [
                        $entity->id(),
                        $view_mode,
                        $entity->language()
                            ->getId(),
                        !empty($entity->in_preview),
                    ],
                ],
                '#create_placeholder' => TRUE,
            ];
        }
        if (!isset($build[$id]['#attached'])) {
            $build[$id]['#attached'] = [];
        }
        $build[$id]['#attached']['library'][] = 'comment/drupal.comment-by-viewer';
        if ($attach_history && $is_node) {
            $build[$id]['#attached']['library'][] = 'comment/drupal.comment-new-indicator';
            // Embed the metadata for the comment "new" indicators on this node.
            $build[$id]['history'] = [
                '#lazy_builder' => [
                    '\\Drupal\\history\\HistoryRenderCallback::lazyBuilder',
                    [
                        $commented_entity->id(),
                    ],
                ],
                '#create_placeholder' => TRUE,
            ];
        }
    }
    if ($build[$id]['#comment_threaded']) {
        // The final comment must close up some hanging divs.
        $build[$id]['#comment_indent_final'] = $current_indent;
    }
}

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