View source
<?php
namespace Drupal\ui_patterns_field_formatters\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\text\TextProcessed;
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\TypedData\Plugin\DataType\Uri;
use Drupal\Core\Url;
class PatternFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
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, UiPatternsManager $patterns_manager, UiPatternsSourceManager $source_manager, ModuleHandlerInterface $module_handler) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$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('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' => [],
'variants_token' => [],
] + 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_properties', $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 = [];
foreach ($items as $delta => $item) {
$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 ($item
->get($source) instanceof TextProcessed) {
$value = $item
->get($source)
->getValue();
}
else {
$value = (string) $item
->get($source)
->getValue();
}
if ($item
->get($source) instanceof Uri) {
$options = [];
if ($item
->getPluginId() === "field_item:link") {
$options = $item
->get('options')
->toArray();
}
$value = Url::fromUri($value, $options)
->toString();
}
$fields[$field['destination']][] = $value;
}
$elements[$delta] = [
'#type' => 'pattern',
'#id' => $this
->getSetting('pattern'),
'#fields' => $fields,
'#multiple_sources' => TRUE,
];
$pattern_variant = $this
->getCurrentVariant($pattern);
if (isset($pattern_variant)) {
$elements[$delta]['#variant'] = $pattern_variant;
}
$settings = $this
->getSetting('pattern_settings');
$pattern_settings = !empty($settings) && isset($settings[$pattern]) ? $settings[$pattern] : NULL;
if (isset($pattern_settings)) {
$elements[$delta]['#settings'] = $pattern_settings;
}
$variant_tokens = $this
->getSetting('variants_token');
$variant_token = !empty($variant_tokens) && isset($variant_tokens[$pattern]) ? $variant_tokens[$pattern] : NULL;
if (isset($variant_tokens)) {
$elements[$delta]['#variant_token'] = $variant_token;
}
$entity = $items
->getEntity();
$elements[$delta]['#context'] = [
'type' => 'field_formatter',
'entity' => $entity,
'item' => $item,
];
}
return $elements;
}
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;
}
}