StringFormatter.php

Same filename and directory in other branches
  1. 9 core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
  2. 8.9.x core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php
  3. 10 core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php

Namespace

Drupal\Core\Field\Plugin\Field\FieldFormatter

File

core/lib/Drupal/Core/Field/Plugin/Field/FieldFormatter/StringFormatter.php

View source
<?php

namespace Drupal\Core\Field\Plugin\Field\FieldFormatter;

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\Attribute\FieldFormatter;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Plugin implementation of the 'string' formatter.
 */
class StringFormatter extends FormatterBase {
    
    /**
     * The entity type manager.
     *
     * @var \Drupal\Core\Entity\EntityTypeManagerInterface
     */
    protected $entityTypeManager;
    
    /**
     * Constructs a StringFormatter instance.
     *
     * @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\Entity\EntityTypeManagerInterface $entity_type_manager
     *   The entity type manager.
     */
    public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager) {
        parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
        $this->entityTypeManager = $entity_type_manager;
    }
    
    /**
     * {@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('entity_type.manager'));
    }
    
    /**
     * {@inheritdoc}
     */
    public static function defaultSettings() {
        $options = parent::defaultSettings();
        $options['link_to_entity'] = FALSE;
        return $options;
    }
    
    /**
     * {@inheritdoc}
     */
    public function settingsForm(array $form, FormStateInterface $form_state) {
        $form = parent::settingsForm($form, $form_state);
        $entity_type = $this->entityTypeManager
            ->getDefinition($this->fieldDefinition
            ->getTargetEntityTypeId());
        if ($entity_type->hasLinkTemplate('canonical')) {
            $form['link_to_entity'] = [
                '#type' => 'checkbox',
                '#title' => $this->t('Link to the @entity_label', [
                    '@entity_label' => $entity_type->getLabel(),
                ]),
                '#default_value' => $this->getSetting('link_to_entity'),
            ];
        }
        return $form;
    }
    
    /**
     * {@inheritdoc}
     */
    public function settingsSummary() {
        $summary = [];
        if ($this->getSetting('link_to_entity')) {
            $entity_type = $this->entityTypeManager
                ->getDefinition($this->fieldDefinition
                ->getTargetEntityTypeId());
            if ($entity_type->hasLinkTemplate('canonical')) {
                $summary[] = $this->t('Linked to the @entity_label', [
                    '@entity_label' => $entity_type->getLabel(),
                ]);
            }
        }
        return $summary;
    }
    
    /**
     * {@inheritdoc}
     */
    public function viewElements(FieldItemListInterface $items, $langcode) {
        $elements = [];
        $url = NULL;
        $entity = $items->getEntity();
        $entity_type = $entity->getEntityType();
        if ($this->getSetting('link_to_entity') && !$entity->isNew() && $entity_type->hasLinkTemplate('canonical')) {
            $url = $this->getEntityUrl($entity);
        }
        foreach ($items as $delta => $item) {
            $view_value = $this->viewValue($item);
            if ($url) {
                $elements[$delta] = [
                    '#type' => 'link',
                    '#title' => $view_value,
                    '#url' => $url,
                ];
            }
            else {
                $elements[$delta] = $view_value;
            }
        }
        return $elements;
    }
    
    /**
     * Generate the output appropriate for one field item.
     *
     * @param \Drupal\Core\Field\FieldItemInterface $item
     *   One field item.
     *
     * @return array
     *   The textual output generated as a render array.
     */
    protected function viewValue(FieldItemInterface $item) {
        // The text value has no text format assigned to it, so the user input
        // should equal the output, including newlines.
        return [
            '#type' => 'inline_template',
            '#template' => '{{ value|nl2br }}',
            '#context' => [
                'value' => $item->value,
            ],
        ];
    }
    
    /**
     * Gets the URI elements of the entity.
     *
     * @param \Drupal\Core\Entity\EntityInterface $entity
     *   The entity object.
     *
     * @return \Drupal\Core\Url
     *   The URI elements of the entity.
     */
    protected function getEntityUrl(EntityInterface $entity) {
        // For the default revision, the 'revision' link template falls back to
        // 'canonical'.
        // @see \Drupal\Core\Entity\Entity::toUrl()
        $rel = $entity->getEntityType()
            ->hasLinkTemplate('revision') ? 'revision' : 'canonical';
        return $entity->toUrl($rel);
    }

}

Classes

Title Deprecated Summary
StringFormatter Plugin implementation of the 'string' formatter.

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