View source
<?php
namespace Drupal\reference_table_formatter\Plugin\Field\FieldFormatter;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\reference_table_formatter\EntityToTableRendererInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class EntityReferenceTableFormatter extends EntityReferenceFormatterBase {
protected $entityTypeManager;
protected $entityDisplayRepository;
protected $tableRenderer;
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('reference_table_formatter.renderer'), $container
->get('entity_type.manager'), $container
->get('entity_display.repository'));
}
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityToTableRendererInterface $reference_renderer, EntityTypeManagerInterface $entity_type_manager, EntityDisplayRepositoryInterface $entity_display_repository) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$this->referenceRenderer = $reference_renderer;
$this->entityTypeManager = $entity_type_manager;
$this->entityDisplayRepository = $entity_display_repository;
}
public static function defaultSettings() {
return [
'view_mode' => 'default',
'show_entity_label' => FALSE,
'empty_cell_value' => '',
'hide_header' => FALSE,
];
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$form['view_mode'] = [
'#title' => $this
->t('View Mode'),
'#description' => $this
->t('Select the view mode which will control which fields are shown and the display settings of those fields.'),
'#type' => 'select',
'#default_value' => $this
->getSetting('view_mode'),
'#options' => $this
->getConfigurableViewModes(),
];
$form['show_entity_label'] = [
'#title' => $this
->t('Display Entity Label'),
'#description' => $this
->t('Whether the label of the target entity be displayed in the table.'),
'#type' => 'checkbox',
'#default_value' => $this
->getSetting('show_entity_label'),
];
$form['hide_header'] = [
'#title' => $this
->t('Hide Table Header'),
'#description' => $this
->t('Whether the table header be displayed.'),
'#type' => 'checkbox',
'#default_value' => $this
->getSetting('hide_header'),
];
$form['empty_cell_value'] = [
'#title' => $this
->t('Empty Cell Value'),
'#description' => $this
->t('The string which should be displayed in empty cells.'),
'#type' => 'textfield',
'#default_value' => $this
->getSetting('empty_cell_value'),
];
return $form;
}
public function settingsSummary() {
$summary = [];
$settings = $this
->getSettings();
$view_modes = $this
->getConfigurableViewModes();
$view_mode = $settings['view_mode'];
$arguments = [
'@mode' => isset($view_modes[$view_mode]) ? $view_modes[$view_mode] : $view_mode,
];
$summary[] = $this
->t('Showing a table of rendered @mode entity fields', $arguments);
if ($settings['show_entity_label']) {
$summary[] = $this
->t('Entity label displayed');
}
if ($settings['hide_header']) {
$summary[] = $this
->t('Table header hidden');
}
if ($settings['empty_cell_value']) {
$summary[] = $this
->t('Empty cell value: @value', [
'@value' => $settings['empty_cell_value'],
]);
}
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) {
if ($entities = $this
->getEntitiesToView($items, $langcode)) {
return [
$this->referenceRenderer
->getTable($this
->getFieldSetting('target_type'), $this
->getTargetBundleId(), $entities, $this
->getSettings()),
];
}
return [];
}
protected function getConfigurableViewModes() {
return $this->entityDisplayRepository
->getViewModeOptions($this
->getFieldSetting('target_type'));
}
protected function getTargetBundleId() {
$settings = $this
->getFieldSettings();
if (strpos($settings['handler'], 'default') === 0) {
$target_entity_type = $this->entityTypeManager
->getDefinition($settings['target_type']);
if (!$target_entity_type
->hasKey('bundle')) {
$target_bundle = $settings['target_type'];
}
elseif (!empty($settings['handler_settings']['target_bundles'])) {
$target_bundle = array_values($settings['handler_settings']['target_bundles']);
$target_bundle = array_shift($target_bundle);
}
else {
throw new \Exception('Cannot render reference table for ' . $this->fieldDefinition
->getLabel() . ': target_bundles setting on the field should not be empty.');
}
}
else {
throw new \Exception('Using non-default reference handler with reference_table_formatter has not yet been implemented.');
}
return $target_bundle;
}
}