entity_reference_revisions-8.x-1.x-dev/src/Plugin/Field/FieldFormatter/EntityReferenceRevisionsLabelFormatter.php
src/Plugin/Field/FieldFormatter/EntityReferenceRevisionsLabelFormatter.php
<?php namespace Drupal\entity_reference_revisions\Plugin\Field\FieldFormatter; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\Exception\UndefinedLinkTemplateException; use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Form\FormStateInterface; /** * Plugin implementation of the 'entity reference revisions label' formatter. * * @FieldFormatter( * id = "entity_reference_revisions_label", * label = @Translation("Label"), * description = @Translation("Display the label of the referenced entity revisions."), * field_types = { * "entity_reference_revisions" * } * ) */ class EntityReferenceRevisionsLabelFormatter extends EntityReferenceRevisionsFormatterBase { /** * {@inheritdoc} */ public static function defaultSettings() { return [ 'link' => TRUE, ] + parent::defaultSettings(); } /** * {@inheritdoc} */ public function settingsForm(array $form, FormStateInterface $form_state) { $elements['link'] = [ '#title' => $this->t('Link label to the referenced entity'), '#type' => 'checkbox', '#default_value' => $this->getSetting('link'), ]; return $elements; } /** * {@inheritdoc} */ public function settingsSummary() { $summary = []; $summary[] = $this->getSetting('link') ? $this->t('Link to the referenced entity') : $this->t('No link'); return $summary; } /** * {@inheritdoc} */ public function viewElements(FieldItemListInterface $items, $langcode) { $elements = []; $output_as_link = $this->getSetting('link'); foreach ($this->getEntitiesToView($items, $langcode) as $delta => $entity) { $label = $entity->label(); // If the link is to be displayed and the entity has a uri, display a // link. if ($output_as_link && !$entity->isNew()) { try { $uri = $entity->toUrl('revision'); } catch (UndefinedLinkTemplateException $e) { // This exception is thrown by \Drupal\Core\Entity\Entity::toUrl() // and it means that the entity type doesn't have a link template nor // a valid "uri_callback", so don't bother trying to output a link for // the rest of the referenced entities. $output_as_link = FALSE; } } if ($output_as_link && isset($uri) && !$entity->isNew()) { $elements[$delta] = [ '#type' => 'link', '#title' => $label, '#url' => $uri, '#options' => $uri->getOptions(), ]; if (!empty($items[$delta]->_attributes)) { $elements[$delta]['#options'] += ['attributes' => []]; $elements[$delta]['#options']['attributes'] += $items[$delta]->_attributes; // Unset field item attributes since they have been included in the // formatter output and shouldn't be rendered in the field template. unset($items[$delta]->_attributes); } } else { $elements[$delta] = ['#plain_text' => $label]; } $elements[$delta]['#cache']['tags'] = $entity->getCacheTags(); } return $elements; } /** * {@inheritdoc} */ protected function checkAccess(EntityInterface $entity) { return $entity->access('view label', NULL, TRUE); } }