ae8bbc2d0897607ed604a3f15bd9c6d769761a01
[yaffs-website] / Plugin / Deriver / TypedDataPropertyDeriverBase.php
1 <?php
2
3 namespace Drupal\ctools\Plugin\Deriver;
4
5
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;
18
19 abstract class TypedDataPropertyDeriverBase extends DeriverBase implements ContainerDeriverInterface {
20
21   use StringTranslationTrait;
22
23   /**
24    * @var \Drupal\Core\TypedData\TypedDataManagerInterface
25    */
26   protected $typedDataManager;
27
28   /**
29    * The label string for use with derivative labels.
30    *
31    * @var string
32    */
33   protected $label = '@property from @base';
34
35   /**
36    * TypedDataPropertyDeriverBase constructor.
37    *
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.
42    */
43   public function __construct(TypedDataManagerInterface $typed_data_manager, TranslationInterface $string_translation) {
44     $this->typedDataManager = $typed_data_manager;
45     $this->stringTranslation = $string_translation;
46   }
47
48   /**
49    * {@inheritdoc}
50    */
51   public static function create(ContainerInterface $container, $base_plugin_id) {
52     return new static(
53       $container->get('typed_data_manager'),
54       $container->get('string_translation')
55     );
56   }
57
58   /**
59    * {@inheritdoc}
60    */
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);
69           }
70         }
71       }
72     }
73     return $this->derivatives;
74   }
75
76   /**
77    * @param $property_definition
78    *
79    * @return mixed
80    */
81   protected function getDataType($property_definition) {
82     if ($property_definition instanceof DataReferenceDefinitionInterface) {
83       return $property_definition->getTargetDefinition()->getDataType();
84     }
85     if ($property_definition instanceof ListDataDefinitionInterface) {
86       return $property_definition->getItemDefinition()->getDataType();
87     }
88     return $property_definition->getDataType();
89   }
90
91   /**
92    * Generates and maintains a derivative definition.
93    *
94    * This method should directly manipulate $this->derivatives and not return
95    * values. This allows implementations control over the derivative names.
96    *
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.
109    *
110    */
111   abstract protected function generateDerivativeDefinition($base_plugin_definition, $data_type_id, $data_type_definition, DataDefinitionInterface $base_definition, $property_name, DataDefinitionInterface $property_definition);
112
113 }