BaseFieldFileFormatterBase.php

Same filename and directory in other branches
  1. 8.9.x core/modules/file/src/Plugin/Field/FieldFormatter/BaseFieldFileFormatterBase.php
  2. 10 core/modules/file/src/Plugin/Field/FieldFormatter/BaseFieldFileFormatterBase.php
  3. 11.x core/modules/file/src/Plugin/Field/FieldFormatter/BaseFieldFileFormatterBase.php

Namespace

Drupal\file\Plugin\Field\FieldFormatter

File

core/modules/file/src/Plugin/Field/FieldFormatter/BaseFieldFileFormatterBase.php

View source
<?php

namespace Drupal\file\Plugin\Field\FieldFormatter;

use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\File\FileUrlGeneratorInterface;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Base class for file formatters, which allow to link to the file download URL.
 */
abstract class BaseFieldFileFormatterBase extends FormatterBase {
    
    /**
     * The file URL generator.
     *
     * @var \Drupal\Core\File\FileUrlGeneratorInterface
     */
    protected $fileUrlGenerator;
    
    /**
     * Constructs a BaseFieldFileFormatterBase object.
     *
     * @param string $plugin_id
     *   The plugin_id for the formatter.
     * @param mixed $plugin_definition
     *   The plugin implementation definition.
     * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
     *   The definition of the field to which the formatter is associated.
     * @param array $settings
     *   The formatter settings.
     * @param string $label
     *   The formatter label display setting.
     * @param string $view_mode
     *   The view mode.
     * @param array $third_party_settings
     *   Any third party settings.
     * @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
     *   The file URL generator.
     */
    public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, FileUrlGeneratorInterface $file_url_generator = NULL) {
        parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
        if (!$file_url_generator) {
            @trigger_error('Calling BaseFieldFileFormatterBase::__construct() without the $file_url_generator argument is deprecated in drupal:9.3.0 and the $file_url_generator argument will be required in drupal:10.0.0. See https://www.drupal.org/node/2940031', E_USER_DEPRECATED);
            $file_url_generator = \Drupal::service('file_url_generator');
        }
        $this->fileUrlGenerator = $file_url_generator;
    }
    
    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
        return new static($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container->get('file_url_generator'));
    }
    
    /**
     * {@inheritdoc}
     */
    public static function defaultSettings() {
        $settings['link_to_file'] = FALSE;
        return $settings;
    }
    
    /**
     * {@inheritdoc}
     */
    public function settingsForm(array $form, FormStateInterface $form_state) {
        $form = parent::settingsForm($form, $form_state);
        $form['link_to_file'] = [
            '#title' => $this->t('Link this field to the file download URL'),
            '#type' => 'checkbox',
            '#default_value' => $this->getSetting('link_to_file'),
        ];
        return $form;
    }
    
    /**
     * {@inheritdoc}
     */
    public function viewElements(FieldItemListInterface $items, $langcode) {
        $elements = [];
        $url = NULL;
        // Add support to link to the entity itself.
        if ($this->getSetting('link_to_file')) {
            $url = $this->fileUrlGenerator
                ->generate($items->getEntity()
                ->getFileUri());
        }
        foreach ($items as $delta => $item) {
            $view_value = $this->viewValue($item);
            if ($url) {
                $elements[$delta] = [
                    '#type' => 'link',
                    '#title' => $view_value,
                    '#url' => $url,
                ];
            }
            else {
                $elements[$delta] = is_array($view_value) ? $view_value : [
                    '#markup' => $view_value,
                ];
            }
        }
        return $elements;
    }
    
    /**
     * Generate the output appropriate for one field item.
     *
     * @param \Drupal\Core\Field\FieldItemInterface $item
     *   One field item.
     *
     * @return mixed
     *   The textual output generated.
     */
    protected abstract function viewValue(FieldItemInterface $item);
    
    /**
     * {@inheritdoc}
     */
    public static function isApplicable(FieldDefinitionInterface $field_definition) {
        return $field_definition->getTargetEntityTypeId() === 'file';
    }

}

Classes

Title Deprecated Summary
BaseFieldFileFormatterBase Base class for file formatters, which allow to link to the file download URL.

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