function CommentLinkBuilder::buildCommentedEntityLinks

Builds links for the given entity.

Parameters

\Drupal\Core\Entity\FieldableEntityInterface $entity: Entity for which the links are being built.

array $context: Array of context passed from the entity view builder.

Return value

array Array of entity links.

Overrides CommentLinkBuilderInterface::buildCommentedEntityLinks

File

core/modules/comment/src/CommentLinkBuilder.php, line 81

Class

CommentLinkBuilder
Defines a class for building markup for comment links on a commented entity.

Namespace

Drupal\comment

Code

public function buildCommentedEntityLinks(FieldableEntityInterface $entity, array &$context) {
  $entity_links = [];
  $view_mode = $context['view_mode'];
  if ($view_mode == 'search_index' || $view_mode == 'search_result' || $view_mode == 'print' || $view_mode == 'rss') {
    // Do not add any links if the entity is displayed for:
    // - search indexing.
    // - constructing a search result excerpt.
    // - print.
    // - rss.
    return [];
  }
  $fields = $this->commentManager
    ->getFields($entity->getEntityTypeId());
  foreach ($fields as $field_name => $detail) {
    // Skip fields that the entity does not have.
    if (!$entity->hasField($field_name)) {
      continue;
    }
    $links = [];
    $commenting_status = $entity->get($field_name)->status;
    if ($commenting_status != CommentItemInterface::HIDDEN) {
      // Entity has commenting status open or closed.
      $field_definition = $entity->getFieldDefinition($field_name);
      if ($view_mode == 'teaser') {
        // Teaser view: display the number of comments that have been posted,
        // or a link to add new comments if the user has permission, the
        // entity is open to new comments, and there currently are none.
        if ($this->currentUser
          ->hasPermission('access comments')) {
          if (!empty($entity->get($field_name)->comment_count)) {
            $links['comment-comments'] = [
              'title' => $this->formatPlural($entity->get($field_name)->comment_count, '1 comment', '@count comments'),
              'attributes' => [
                'title' => $this->t('Jump to the first comment.'),
              ],
              'fragment' => 'comments',
              'url' => $entity->toUrl(),
            ];
          }
        }
        // Provide a link to new comment form.
        if ($commenting_status == CommentItemInterface::OPEN) {
          $comment_form_location = $field_definition->getSetting('form_location');
          if ($this->currentUser
            ->hasPermission('post comments')) {
            $links['comment-add'] = [
              'title' => $this->t('Add new comment'),
              'language' => $entity->language(),
              'attributes' => [
                'title' => $this->t('Share your thoughts and opinions.'),
              ],
              'fragment' => 'comment-form',
            ];
            if ($comment_form_location == CommentItemInterface::FORM_SEPARATE_PAGE) {
              $links['comment-add']['url'] = Url::fromRoute('comment.reply', [
                'entity_type' => $entity->getEntityTypeId(),
                'entity' => $entity->id(),
                'field_name' => $field_name,
              ]);
            }
            else {
              $links['comment-add'] += [
                'url' => $entity->toUrl(),
              ];
            }
          }
          elseif ($this->currentUser
            ->isAnonymous()) {
            $links['comment-forbidden'] = [
              'title' => $this->commentManager
                ->forbiddenMessage($entity, $field_name),
            ];
          }
        }
      }
      else {
        // Entity in other view modes: add a "post comment" link if the user
        // is allowed to post comments and if this entity is allowing new
        // comments.
        if ($commenting_status == CommentItemInterface::OPEN) {
          $comment_form_location = $field_definition->getSetting('form_location');
          if ($this->currentUser
            ->hasPermission('post comments')) {
            // Show the "post comment" link if the form is on another page, or
            // if there are existing comments that the link will skip past.
            if ($comment_form_location == CommentItemInterface::FORM_SEPARATE_PAGE || !empty($entity->get($field_name)->comment_count) && $this->currentUser
              ->hasPermission('access comments')) {
              $links['comment-add'] = [
                'title' => $this->t('Add new comment'),
                'attributes' => [
                  'title' => $this->t('Share your thoughts and opinions.'),
                ],
                'fragment' => 'comment-form',
              ];
              if ($comment_form_location == CommentItemInterface::FORM_SEPARATE_PAGE) {
                $links['comment-add']['url'] = Url::fromRoute('comment.reply', [
                  'entity_type' => $entity->getEntityTypeId(),
                  'entity' => $entity->id(),
                  'field_name' => $field_name,
                ]);
              }
              else {
                $links['comment-add']['url'] = $entity->toUrl();
              }
            }
          }
          elseif ($this->currentUser
            ->isAnonymous()) {
            $links['comment-forbidden'] = [
              'title' => $this->commentManager
                ->forbiddenMessage($entity, $field_name),
            ];
          }
        }
      }
    }
    if (!empty($links)) {
      $entity_links['comment__' . $field_name] = [
        '#theme' => 'links__entity__comment__' . $field_name,
        '#links' => $links,
        '#attributes' => [
          'class' => [
            'links',
            'inline',
          ],
        ],
      ];
    }
  }
  return $entity_links;
}

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