You are here

public function FieldDownloadCount::viewElements in Open Social 8.7

Same name and namespace in other branches
  1. 8.9 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  2. 8 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  3. 8.2 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  4. 8.3 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  5. 8.4 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  6. 8.5 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  7. 8.6 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  8. 8.8 modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  9. 10.3.x modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  10. 10.0.x modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  11. 10.1.x modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()
  12. 10.2.x modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php \Drupal\download_count\Plugin\Field\FieldFormatter\FieldDownloadCount::viewElements()

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

modules/custom/download_count/src/Plugin/Field/FieldFormatter/FieldDownloadCount.php, line 27

Class

FieldDownloadCount
The FieldDownloadCount class.

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;
    }
    $link_url = file_create_url($file
      ->getFileUri());
    $file_size = $file
      ->getSize();
    $options = [
      'attributes' => [
        'type' => $file
          ->getMimeType() . '; length=' . $file
          ->getSize(),
      ],
    ];

    // Use the description as the link text if available.
    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,
    ]);
    $link = Link::fromTextAndUrl($link_text, Url::fromUri($link_url, $options))
      ->toString();
    if (isset($file->download) && $file->download > 0) {
      $count = \Drupal::translation()
        ->formatPlural($file->download, '1 download', '@count downloads');
    }
    else {
      $count = $this
        ->t('0 downloads');
    }
    $theme = \Drupal::theme()
      ->getActiveTheme();

    // Check if socialbase is one of the base themes.
    // Then get the path to socialbase theme and provide a variable
    // that can be used in the template for a path to the icons.
    if (array_key_exists('socialbase', $theme
      ->getBaseThemes())) {
      $basethemes = $theme
        ->getBaseThemes();
      $path_to_socialbase = $basethemes['socialbase']
        ->getPath();
    }
    $mime_type = $file
      ->getMimeType();
    $generic_mime_type = file_icon_class($mime_type);
    if (isset($generic_mime_type)) {

      // Set new icons for the mime types.
      switch ($generic_mime_type) {
        case 'application-pdf':
          $node_icon = 'pdf';
          break;
        case 'x-office-document':
          $node_icon = 'document';
          break;
        case 'x-office-presentation':
          $node_icon = 'presentation';
          break;
        case 'x-office-spreadsheet':
          $node_icon = 'spreadsheet';
          break;
        case 'package-x-generic':
          $node_icon = 'archive';
          break;
        case 'audio':
          $node_icon = 'audio';
          break;
        case 'video':
          $node_icon = 'video';
          break;
        case 'image':
          $node_icon = 'image';
          break;
        default:
          $node_icon = 'text';
      }
    }
    $element[$delta] = [
      '#theme' => !$access ? 'file_link' : 'download_count_file_field_formatter',
      '#file' => $file,
      '#link' => $link,
      '#link_url' => $link_url,
      '#link_text' => $link_text,
      '#classes' => $attributes['class'],
      '#count' => $count,
      '#file_size' => format_size($file_size),
      '#path_to_socialbase' => $path_to_socialbase,
      '#node_icon' => $node_icon,
      '#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;
}