View source
<?php
namespace Drupal\ui_patterns_field_formatters\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\ui_patterns\Form\PatternDisplayFormTrait;
use Drupal\ui_patterns\UiPatternsSourceManager;
use Drupal\ui_patterns\UiPatternsManager;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
class PatternWrapperEntityReferenceFormatter extends EntityReferenceEntityFormatter {
use PatternDisplayFormTrait;
protected $patternsManager;
protected $sourceManager;
protected $moduleHandler;
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, LoggerChannelFactoryInterface $logger_factory, EntityTypeManagerInterface $entity_type_manager, EntityDisplayRepositoryInterface $entity_display_repository, UiPatternsManager $patterns_manager, UiPatternsSourceManager $source_manager, ModuleHandlerInterface $module_handler) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $logger_factory, $entity_type_manager, $entity_display_repository);
$this->patternsManager = $patterns_manager;
$this->sourceManager = $source_manager;
$this->moduleHandler = $module_handler;
}
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('logger.factory'), $container
->get('entity_type.manager'), $container
->get('entity_display.repository'), $container
->get('plugin.manager.ui_patterns'), $container
->get('plugin.manager.ui_patterns_source'), $container
->get('module_handler'));
}
public static function defaultSettings() {
return [
'pattern' => '',
'variants' => '',
'pattern_mapping' => [],
'pattern_settings' => [],
] + parent::defaultSettings();
}
public function settingsForm(array $form, FormStateInterface $form_state) {
$form = parent::settingsForm($form, $form_state);
$field_storage_definition = $this->fieldDefinition
->getFieldStorageDefinition();
$context = [
'storageDefinition' => $field_storage_definition,
'limit' => $field_storage_definition
->getPropertyNames(),
];
$configuration = $this
->getSettings();
$pattern = $this
->getSetting('pattern');
$pattern_variant = $this
->getCurrentVariant($pattern);
if (isset($pattern_variant)) {
$configuration['pattern_variant'] = $pattern_variant;
}
$this
->buildPatternDisplayForm($form, 'field_wrapper', $context, $configuration);
return $form;
}
public function settingsSummary() {
$summary = [];
$pattern = $this
->getSetting('pattern');
if (!empty($pattern)) {
$pattern_definition = $this->patternsManager
->getDefinition($pattern);
$label = $this
->t('None');
if (!empty($this
->getSetting('pattern'))) {
$label = $pattern_definition
->getLabel();
}
$summary[] = $this
->t('Pattern: @pattern', [
'@pattern' => $label,
]);
$pattern_variant = $this
->getCurrentVariant($pattern);
if (isset($pattern_variant)) {
$variant = $this
->getSetting('variants')[$pattern_definition
->id()];
$variant = $pattern_definition
->getVariant($variant)
->getLabel();
$summary[] = $this
->t('Variant: @variant', [
'@variant' => $variant,
]);
}
}
return $summary;
}
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = parent::viewElements($items, $langcode);
$pattern = $this
->getSetting('pattern');
$fields = [];
$mapping = $this
->getSetting('pattern_mapping');
$mapping = $mapping[$pattern]['settings'];
foreach ($mapping as $source => $field) {
if ($field['destination'] === '_hidden') {
continue;
}
$source = explode(":", $source)[1];
if ($source === 'items') {
$fields[$field['destination']][] = $elements;
}
if ($source === 'label') {
$fields[$field['destination']][] = $items
->getFieldDefinition()
->getLabel();
}
}
$build = [
'#type' => 'pattern',
'#id' => $this
->getSetting('pattern'),
'#fields' => $fields,
'#multiple_sources' => TRUE,
];
$pattern_variant = $this
->getCurrentVariant($pattern);
if (isset($pattern_variant)) {
$build['#variant'] = $pattern_variant;
}
$settings = $this
->getSetting('pattern_settings');
$pattern_settings = !empty($settings) && isset($settings[$pattern]) ? $settings[$pattern] : NULL;
if (isset($pattern_settings)) {
$build['#settings'] = $pattern_settings;
}
$entity = $items
->getEntity();
$build['#context'] = [
'type' => 'field_formatter',
'entity' => $entity,
];
return $build;
}
protected function getDefaultValue(array $configuration, $field_name, $value) {
$pattern = $configuration['pattern'];
if (isset($configuration['pattern_mapping'][$pattern]['settings'][$field_name][$value])) {
return $configuration['pattern_mapping'][$pattern]['settings'][$field_name][$value];
}
return NULL;
}
protected function getCurrentVariant($pattern) {
$variants = $this
->getSetting('variants');
return !empty($variants) && isset($variants[$pattern]) ? $variants[$pattern] : NULL;
}
}