EntityReferenceDisplayFormatterTrait.php in Entity Reference Display 8
File
src/Plugin/Field/FieldFormatter/EntityReferenceDisplayFormatterTrait.php
View source
<?php
namespace Drupal\entity_reference_display\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
trait EntityReferenceDisplayFormatterTrait {
public static function defaultSettings() {
return [
'display_field' => NULL,
] + parent::defaultSettings();
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$element = [];
$display_fields = $this
->getDisplayFields();
$element['display_field'] = [
'#type' => 'select',
'#title' => $this
->t('Display mode field'),
'#description' => $this
->t('Select a field of which value will be used as a display mode for rendering.'),
'#options' => $display_fields,
'#default_value' => $this
->getSetting('display_field'),
'#required' => TRUE,
'#access' => count($display_fields) > 1,
];
return $element;
}
public function settingsSummary() {
$summary = [];
$display_fields = $this
->getDisplayFields();
$display_field = $this
->getDisplayField($display_fields);
$field_label = $display_fields[$display_field];
$summary[] = $this
->t('Rendered by display mode selected in "@field" field.', [
'@field' => $field_label,
]);
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) {
$display_fields = $this
->getDisplayFields();
$display_field = $this
->getDisplayField($display_fields);
$entity = $items
->getEntity();
if ($entity
->hasField($display_field)) {
$display_mode = $entity
->get($display_field)->value;
if (!empty($display_mode)) {
$this
->setSetting('view_mode', $display_mode);
}
}
return parent::viewElements($items, $langcode);
}
public static function isApplicable(FieldDefinitionInterface $field_definition) {
$entity_type = $field_definition
->getTargetEntityTypeId();
$entity_bundle = $field_definition
->getTargetBundle();
if (!empty($entity_bundle)) {
$entity_fields = \Drupal::service('entity_field.manager')
->getFieldDefinitions($entity_type, $entity_bundle);
foreach ($entity_fields as $field) {
if ($field
->getType() == 'entity_reference_display') {
return TRUE;
}
}
}
return FALSE;
}
private function getDisplayFields() {
$display_fields = [];
$entity_type = $this->fieldDefinition
->getTargetEntityTypeId();
$entity_bundle = $this->fieldDefinition
->getTargetBundle();
$entity_fields = \Drupal::service('entity_field.manager')
->getFieldDefinitions($entity_type, $entity_bundle);
foreach ($entity_fields as $key => $field) {
if ($field
->getType() == 'entity_reference_display') {
$display_fields[$key] = $field
->getLabel();
}
}
return $display_fields;
}
private function getDisplayField(array $display_fields) {
$display_field = $this
->getSetting('display_field');
if (empty($display_field)) {
$display_field = key($display_fields);
}
return $display_field;
}
}