View source
<?php
namespace Drupal\entity_extra_field;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\ContentEntityTypeInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\PluginBase;
use Drupal\Core\Plugin\PluginDependencyTrait;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Utility\Token;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class ExtraFieldTypePluginBase extends PluginBase implements ExtraFieldTypePluginInterface {
use PluginDependencyTrait;
protected $token;
protected $moduleHandler;
protected $currentRouteMatch;
protected $entityTypeManager;
protected $entityFieldManager;
public function __construct(array $configuration, $plugin_id, $plugin_definition, Token $token, ModuleHandlerInterface $module_handler, RouteMatchInterface $current_route_match, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->token = $token;
$this->moduleHandler = $module_handler;
$this->currentRouteMatch = $current_route_match;
$this->entityTypeManager = $entity_type_manager;
$this->entityFieldManager = $entity_field_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('token'), $container
->get('module_handler'), $container
->get('current_route_match'), $container
->get('entity_type.manager'), $container
->get('entity_field.manager'));
}
public function label() {
return $this->pluginDefinition['label'];
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form['#prefix'] = '<div id="extra-field-plugin">';
$form['#suffix'] = '</div>';
$form['#parents'] = [
'field_type_config',
];
return $form;
}
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration = $form_state
->cleanValues()
->getValues();
}
public function setConfiguration(array $configuration) {
$this->configuration = $configuration;
}
public function getConfiguration() {
return $this->configuration + $this
->defaultConfiguration();
}
public function defaultConfiguration() {
return [];
}
public function calculateDependencies() {
return $this->dependencies;
}
public function extraFieldPluginAjaxCallback(array $form, FormStateInterface $form_state) {
return $form['field_type_config'];
}
protected function extraFieldPluginAjax() {
return [
'wrapper' => 'extra-field-plugin',
'callback' => [
$this,
'extraFieldPluginAjaxCallback',
],
];
}
protected function getTargetEntityTypeId() {
return $this->currentRouteMatch
->getParameter('entity_type_id') ?: NULL;
}
protected function getTargetEntityTypeBundle() {
$entity_type_id = $this
->getTargetEntityTypeId();
$bundle_entity_type = $bundle_entity_type = $this->entityTypeManager
->getDefinition($entity_type_id)
->getBundleEntityType();
if (!isset($bundle_entity_type)) {
return FALSE;
}
return $this->currentRouteMatch
->getParameter($bundle_entity_type) ?: FALSE;
}
protected function getTargetEntityTypeDefinition() {
return $this->entityTypeManager
->getDefinition($this
->getTargetEntityTypeId());
}
protected function processEntityToken($text, ContentEntityInterface $entity) {
return $this->token
->replace($text, $this
->getEntityTokenData($entity), [
'clear' => TRUE,
]);
}
protected function getEntityTokenTypes($entity_type_id, $entity_bundle) {
$types = $this
->getEntityFieldReferenceTypes($entity_type_id, $entity_bundle);
$types = array_values($types);
if (!in_array($entity_type_id, $types)) {
$types[] = $entity_type_id;
}
return $types;
}
protected function getEntityTokenData(ContentEntityInterface $entity) {
$field_references = $this
->getEntityFieldReferenceTypes($entity
->getEntityTypeId(), $entity
->bundle());
$data[$entity
->getEntityTypeId()] = $entity;
foreach ($field_references as $field_name => $target_type) {
if (!$entity
->hasField($field_name) || isset($data[$target_type])) {
continue;
}
$data[$target_type] = $entity->{$field_name}->entity;
}
return array_filter($data);
}
protected function getEntityFieldReferenceTypes($entity_type_id, $entity_bundle) {
$types = [];
$fields = $this->entityFieldManager
->getFieldDefinitions($entity_type_id, $entity_bundle);
foreach ($fields as $field_name => $field) {
if ($field
->getType() !== 'entity_reference') {
continue;
}
$definition = $field
->getFieldStorageDefinition();
$target_type = $definition
->getSetting('target_type');
if (!isset($target_type) || in_array($target_type, $types)) {
continue;
}
$type_definition = $this->entityTypeManager
->getDefinition($target_type);
if (!$type_definition instanceof ContentEntityTypeInterface) {
continue;
}
$types[$field_name] = $target_type;
}
return $types;
}
protected function getPluginFormStateValue($key, FormStateInterface $form_state, $default = NULL) {
$key = !is_array($key) ? [
$key,
] : $key;
$inputs = [
$form_state
->cleanValues()
->getValues(),
$this
->getConfiguration(),
];
foreach ($inputs as $input) {
$value = NestedArray::getValue($input, $key, $key_exists);
if (!isset($value) && !$key_exists) {
continue;
}
return $value;
}
return $default;
}
}