You are here

function template_preprocess_download_file_link in File Download 8

.

Prepares variables for file link templates.

Default template: file-link.html.twig.

Parameters

array $variables: An associative array containing:

  • file: A file object to which the link will be created.
  • icon_directory: (optional) A path to a directory of icons to be used for files. Defaults to the value of the "icon.directory" variable.
  • description: A description to be displayed instead of the filename.
  • attributes: An associative array of attributes to be placed in the a tag.

File

./file_download.module, line 46
.

Code

function template_preprocess_download_file_link(&$variables) {
  $file = $variables['file'];
  $options = [];
  $file_entity = $file instanceof File ? $file : File::load($file->fid);

  // @todo Wrap in file_url_transform_relative(). This is currently
  // impossible. As a work-around, we currently add the 'url.site' cache context.
  // To ensure different file URLs are generated for different sites in a.
  // Multisite setup, including HTTP and HTTPS versions of the same site.
  // Fix in https://www.drupal.org/node/2646744.
  $url = file_create_url($file_entity
    ->getFileUri());
  $variables['#cache']['contexts'][] = 'url.site';
  $mime_type = $file
    ->getMimeType();

  // Set options as per anchor format described at.
  // http://microformats.org/wiki/file-format-examples
  $options['attributes']['type'] = $mime_type . '; length=' . $file
    ->getSize();

  // Use the title as the link text if available.
  if ($variables['title'] === NULL) {
    $link_text = $file_entity
      ->getFilename();
  }
  else {
    $link_text = $variables['title'];
    $options['attributes']['title'] = $file_entity
      ->getFilename();
  }

  // Classes to add to the file field for icons.
  // Add a specific class for each and every mime type.
  $classes = [
    'file',
    // Add a more general class for groups of well known MIME types.
    'file--mime-' . strtr($mime_type, [
      '/' => '-',
      '.' => '-',
    ]),
    'file--' . file_icon_class($mime_type),
  ];

  // Set file classes to the options array.
  $variables['attributes'] = new Attribute($variables['attributes']);
  $variables['attributes']
    ->addClass($classes);
  $uri = $file_entity
    ->getFileUri();
  $parts = explode('://', $uri);
  $url = 'internal:/file-download/download/' . $parts[0] . '/' . $file_entity
    ->id();
  $variables['link'] = [
    '#type' => 'link',
    '#title' => Markup::create($link_text),
    '#url' => Url::fromUri($url, $options),
    '#allowed_tags' => [
      'span',
    ],
  ];
}