You are here

public function FieldDownloadCount::viewElements in Download Count 8

Builds a renderable array for a field value.

Parameters

\Drupal\Core\Field\FieldItemListInterface $items: The field values to be rendered.

string $langcode: The language that should be used to render the field.

Return value

array A renderable array for $items, as an array of child elements keyed by consecutive numeric indexes starting from 0.

Overrides GenericFileFormatter::viewElements

File

src/Plugin/Field/FieldFormatter/FieldDownloadCount.php, line 27

Class

FieldDownloadCount
Field formatter for download count.

Namespace

Drupal\download_count\Plugin\Field\FieldFormatter

Code

public function viewElements(FieldItemListInterface $items, $langcode) {
  $element = [];
  $entity = $items
    ->getEntity();
  $entity_type = $entity
    ->getEntityTypeId();
  $access = Drupal::currentUser()
    ->hasPermission('view download counts');
  foreach ($this
    ->getEntitiesToView($items, $langcode) as $delta => $file) {
    $item = $file->_referringItem;
    if ($access) {
      $download = Database::getConnection()
        ->query('SELECT COUNT(fid) from {download_count} where fid = :fid AND type = :type AND id = :id', [
        ':fid' => $file
          ->id(),
        ':type' => $entity_type,
        ':id' => $entity
          ->id(),
      ])
        ->fetchField();
      $file->download = $download;
    }
    $url = file_create_url($file
      ->getFileUri());
    $options = [
      'attributes' => [
        'type' => $file
          ->getMimeType() . '; length=' . $file
          ->getSize(),
      ],
    ];
    if (empty($item->description)) {
      $link_text = $file
        ->getFilename();
    }
    else {
      $link_text = $item->description;
      $options['attributes']['title'] = Html::escape($file
        ->getFilename());
    }

    // Classes to add to the file field for icons.
    $classes = [
      'file',
      // Add a specific class for each and every mime type.
      'file--mime-' . strtr($file
        ->getMimeType(), [
        '/' => '-',
        '.' => '-',
      ]),
      // Add a more general class for groups of well known mime types.
      'file--' . file_icon_class($file
        ->getMimeType()),
    ];
    $attributes = new Attribute([
      'class' => $classes,
    ]);
    $url = Link::fromTextAndUrl($this
      ->t('@text', [
      '@text' => $link_text,
    ]), Url::fromUri($url, $options))
      ->toString();
    if (isset($file->download) && $file->download > 0) {
      $count = Drupal::translation()
        ->formatPlural($file->download, 'Downloaded 1 time', 'Downloaded @count times');
    }
    else {
      $count = $this
        ->t('Never downloaded');
    }
    $element[$delta] = [
      '#theme' => !$access ? 'file_link' : 'download_count_file_field_formatter',
      '#file' => $file,
      '#url' => $url,
      '#classes' => $attributes['class'],
      '#count' => $count,
      '#attached' => [
        'library' => [
          'classy/file',
        ],
      ],
      '#cache' => [
        'tags' => $file
          ->getCacheTags(),
      ],
    ];

    // Pass field item attributes to the theme function.
    if (isset($item->_attributes)) {
      $element[$delta] += [
        '#attributes' => [],
      ];
      $element[$delta]['#attributes'] += $item->_attributes;

      // Unset field item attributes since they have been included in the
      // formatter output and should not be rendered in the field template.
      unset($item->_attributes);
    }
  }
  return $element;
}