View source
<?php
namespace Drupal\custom_formatters\Plugin\CustomFormatters\FormatterType;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Form\FormStateInterface;
use Drupal\custom_formatters\FormatterTypeBase;
class FormatterPreset extends FormatterTypeBase {
protected $formatterManager = NULL;
public function __construct(array $configuration, $plugin_id, $plugin_definition) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->formatterManager = \Drupal::service('plugin.manager.field.formatter');
}
public function calculateDependencies() {
$dependencies = parent::calculateDependencies();
$formatter_definitions = $this->formatterManager
->getDefinitions();
if (isset($formatter_definitions[$this->entity->data['formatter']])) {
$dependencies['module'][] = $formatter_definitions[$this->entity->data['formatter']]['provider'];
$formatter_instance = $this
->getFormatter($this->entity->data['formatter'], $this->entity
->get('field_types')[0]);
$formatter_dependencies = $formatter_instance
->calculateDependencies();
$dependencies = array_merge_recursive($dependencies, $formatter_dependencies);
}
return $dependencies;
}
public function settingsForm(array &$form, FormStateInterface $form_state) {
$form['data'] = [
'#type' => 'container',
'#tree' => TRUE,
];
$field_type = !is_null($form_state
->getValue('field_types')) ? $form_state
->getValue('field_types') : $this->entity
->get('field_types')[0];
if (is_null($field_type)) {
return $form;
}
$options = [];
$formatters = $this->formatterManager
->getDefinitions();
foreach ($formatters as $formatter_name => $formatter) {
if (in_array($field_type, $formatter['field_types'])) {
$label = $formatter['label'];
$options[$formatter_name] = $label
->render();
}
}
if (empty($options)) {
$form['error'] = [
'#type' => 'markup',
'#markup' => $this
->t("The selected field type doesn't have any available formatters."),
];
return $form;
}
$form['data']['formatter'] = [
'#title' => $this
->t('Formatter'),
'#type' => 'select',
'#options' => $options,
'#default_value' => isset($this->entity
->get('data')['formatter']) ? $this->entity
->get('data')['formatter'] : '',
'#ajax' => [
'callback' => [
'Drupal\\custom_formatters\\Form\\FormatterForm',
'formAjax',
],
'wrapper' => 'plugin-wrapper',
],
];
$formatter_name = isset($form_state
->getValue('data')['formatter']) ? $form_state
->getValue('data')['formatter'] : $form['data']['formatter']['#default_value'];
if (!isset($form['data']['formatter']['#options'][$formatter_name])) {
$formatter_name = key($form['data']['formatter']['#options']);
}
$formatter = $this
->getFormatter($formatter_name, $field_type);
$form['data']['settings'] = $formatter
->settingsForm($form, $form_state);
$form['data']['settings']['#tree'] = TRUE;
return $form;
}
public function submitForm(array $form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
$this->entity
->set('field_types', [
$this->entity
->get('field_types'),
]);
}
public function viewElements(FieldItemListInterface $items, $langcode) {
return $this
->getFormatter($this->entity
->get('data')['formatter'], $this->entity
->get('field_types')[0])
->viewElements($items, $langcode);
}
protected function getFormatter($formatter_name, $field_type) {
return $this->formatterManager
->createInstance($formatter_name, [
'field_definition' => BaseFieldDefinition::create($field_type),
'settings' => isset($this->entity
->get('data')['settings']) ? $this->entity
->get('data')['settings'] : [],
'label' => '',
'view_mode' => '',
'third_party_settings' => [],
]);
}
}