3 namespace Drupal\ctools\Plugin\Deriver;
6 use Drupal\Component\Plugin\Derivative\DeriverBase;
7 use Drupal\Core\Field\BaseFieldDefinition;
8 use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
9 use Drupal\Core\StringTranslation\StringTranslationTrait;
10 use Drupal\Core\StringTranslation\TranslationInterface;
11 use Drupal\Core\TypedData\ComplexDataInterface;
12 use Drupal\Core\TypedData\DataDefinitionInterface;
13 use Drupal\Core\TypedData\DataReferenceDefinitionInterface;
14 use Drupal\Core\TypedData\ListDataDefinitionInterface;
15 use Drupal\Core\TypedData\TypedDataManagerInterface;
16 use Drupal\field\Entity\FieldConfig;
17 use Symfony\Component\DependencyInjection\ContainerInterface;
19 abstract class TypedDataPropertyDeriverBase extends DeriverBase implements ContainerDeriverInterface {
21 use StringTranslationTrait;
24 * @var \Drupal\Core\TypedData\TypedDataManagerInterface
26 protected $typedDataManager;
29 * The label string for use with derivative labels.
33 protected $label = '@property from @base';
36 * TypedDataPropertyDeriverBase constructor.
38 * @param \Drupal\Core\TypedData\TypedDataManagerInterface $typed_data_manager
39 * The typed data manager.
40 * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
41 * The string translation service.
43 public function __construct(TypedDataManagerInterface $typed_data_manager, TranslationInterface $string_translation) {
44 $this->typedDataManager = $typed_data_manager;
45 $this->stringTranslation = $string_translation;
51 public static function create(ContainerInterface $container, $base_plugin_id) {
53 $container->get('typed_data_manager'),
54 $container->get('string_translation')
61 public function getDerivativeDefinitions($base_plugin_definition) {
62 foreach ($this->typedDataManager->getDefinitions() as $data_type_id => $data_type_definition) {
63 if (is_subclass_of($data_type_definition['class'], ComplexDataInterface::class, TRUE)) {
64 /** @var \Drupal\Core\TypedData\ComplexDataDefinitionInterface $base_definition */
65 $base_definition = $this->typedDataManager->createDataDefinition($data_type_id);
66 foreach ($base_definition->getPropertyDefinitions() as $property_name => $property_definition) {
67 if ($property_definition instanceof BaseFieldDefinition || $property_definition instanceof FieldConfig) {
68 $this->generateDerivativeDefinition($base_plugin_definition, $data_type_id, $data_type_definition, $base_definition, $property_name, $property_definition);
73 return $this->derivatives;
77 * @param $property_definition
81 protected function getDataType($property_definition) {
82 if ($property_definition instanceof DataReferenceDefinitionInterface) {
83 return $property_definition->getTargetDefinition()->getDataType();
85 if ($property_definition instanceof ListDataDefinitionInterface) {
86 return $property_definition->getItemDefinition()->getDataType();
88 return $property_definition->getDataType();
92 * Generates and maintains a derivative definition.
94 * This method should directly manipulate $this->derivatives and not return
95 * values. This allows implementations control over the derivative names.
97 * @param $base_plugin_definition
98 * The base plugin definition.
99 * @param string $data_type_id
100 * The plugin id of the data type.
101 * @param mixed $data_type_definition
102 * The plugin definition of the data type.
103 * @param \Drupal\Core\TypedData\DataDefinitionInterface $base_definition
104 * The data type definition of a complex data object.
105 * @param string $property_name
106 * The name of the property
107 * @param \Drupal\Core\TypedData\DataDefinitionInterface $property_definition
108 * The property definition.
111 abstract protected function generateDerivativeDefinition($base_plugin_definition, $data_type_id, $data_type_definition, DataDefinitionInterface $base_definition, $property_name, DataDefinitionInterface $property_definition);