Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\field;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Uuid\UuidInterface;
|
Chris@0
|
6 use Drupal\Core\Config\Entity\ConfigEntityStorage;
|
Chris@0
|
7 use Drupal\Core\Entity\EntityInterface;
|
Chris@0
|
8 use Drupal\Core\Entity\EntityManagerInterface;
|
Chris@0
|
9 use Drupal\Core\Entity\EntityTypeInterface;
|
Chris@14
|
10 use Drupal\Core\Field\DeletedFieldsRepositoryInterface;
|
Chris@0
|
11 use Drupal\Core\Field\FieldTypePluginManagerInterface;
|
Chris@0
|
12 use Drupal\Core\Language\LanguageManagerInterface;
|
Chris@0
|
13 use Symfony\Component\DependencyInjection\ContainerInterface;
|
Chris@0
|
14 use Drupal\Core\Config\ConfigFactoryInterface;
|
Chris@0
|
15 use Drupal\Core\Extension\ModuleHandlerInterface;
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@14
|
18 * Storage handler for "field storage" configuration entities.
|
Chris@0
|
19 */
|
Chris@0
|
20 class FieldStorageConfigStorage extends ConfigEntityStorage {
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * The module handler.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @var \Drupal\Core\Extension\ModuleHandlerInterface
|
Chris@0
|
26 */
|
Chris@0
|
27 protected $moduleHandler;
|
Chris@0
|
28
|
Chris@0
|
29 /**
|
Chris@0
|
30 * The entity manager.
|
Chris@0
|
31 *
|
Chris@0
|
32 * @var \Drupal\Core\Entity\EntityManagerInterface
|
Chris@0
|
33 */
|
Chris@0
|
34 protected $entityManager;
|
Chris@0
|
35
|
Chris@0
|
36 /**
|
Chris@0
|
37 * The field type plugin manager.
|
Chris@0
|
38 *
|
Chris@0
|
39 * @var \Drupal\Core\Field\FieldTypePluginManagerInterface
|
Chris@0
|
40 */
|
Chris@0
|
41 protected $fieldTypeManager;
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@14
|
44 * The deleted fields repository.
|
Chris@14
|
45 *
|
Chris@14
|
46 * @var \Drupal\Core\Field\DeletedFieldsRepositoryInterface
|
Chris@14
|
47 */
|
Chris@14
|
48 protected $deletedFieldsRepository;
|
Chris@14
|
49
|
Chris@14
|
50 /**
|
Chris@0
|
51 * Constructs a FieldStorageConfigStorage object.
|
Chris@0
|
52 *
|
Chris@0
|
53 * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
|
Chris@0
|
54 * The entity type definition.
|
Chris@0
|
55 * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
|
Chris@0
|
56 * The config factory service.
|
Chris@0
|
57 * @param \Drupal\Component\Uuid\UuidInterface $uuid_service
|
Chris@0
|
58 * The UUID service.
|
Chris@0
|
59 * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
|
Chris@0
|
60 * The language manager.
|
Chris@0
|
61 * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
|
Chris@0
|
62 * The entity manager.
|
Chris@0
|
63 * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
|
Chris@0
|
64 * The module handler.
|
Chris@14
|
65 * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager
|
Chris@0
|
66 * The field type plugin manager.
|
Chris@14
|
67 * @param \Drupal\Core\Field\DeletedFieldsRepositoryInterface $deleted_fields_repository
|
Chris@14
|
68 * The deleted fields repository.
|
Chris@0
|
69 */
|
Chris@14
|
70 public function __construct(EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, UuidInterface $uuid_service, LanguageManagerInterface $language_manager, EntityManagerInterface $entity_manager, ModuleHandlerInterface $module_handler, FieldTypePluginManagerInterface $field_type_manager, DeletedFieldsRepositoryInterface $deleted_fields_repository) {
|
Chris@0
|
71 parent::__construct($entity_type, $config_factory, $uuid_service, $language_manager);
|
Chris@0
|
72 $this->entityManager = $entity_manager;
|
Chris@0
|
73 $this->moduleHandler = $module_handler;
|
Chris@0
|
74 $this->fieldTypeManager = $field_type_manager;
|
Chris@14
|
75 $this->deletedFieldsRepository = $deleted_fields_repository;
|
Chris@0
|
76 }
|
Chris@0
|
77
|
Chris@0
|
78 /**
|
Chris@0
|
79 * {@inheritdoc}
|
Chris@0
|
80 */
|
Chris@0
|
81 public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
|
Chris@0
|
82 return new static(
|
Chris@0
|
83 $entity_type,
|
Chris@0
|
84 $container->get('config.factory'),
|
Chris@0
|
85 $container->get('uuid'),
|
Chris@0
|
86 $container->get('language_manager'),
|
Chris@0
|
87 $container->get('entity.manager'),
|
Chris@0
|
88 $container->get('module_handler'),
|
Chris@14
|
89 $container->get('plugin.manager.field.field_type'),
|
Chris@14
|
90 $container->get('entity_field.deleted_fields_repository')
|
Chris@0
|
91 );
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * {@inheritdoc}
|
Chris@0
|
96 */
|
Chris@0
|
97 public function loadByProperties(array $conditions = []) {
|
Chris@0
|
98 // Include deleted fields if specified in the $conditions parameters.
|
Chris@0
|
99 $include_deleted = isset($conditions['include_deleted']) ? $conditions['include_deleted'] : FALSE;
|
Chris@0
|
100 unset($conditions['include_deleted']);
|
Chris@0
|
101
|
Chris@0
|
102 /** @var \Drupal\field\FieldStorageConfigInterface[] $storages */
|
Chris@0
|
103 $storages = [];
|
Chris@0
|
104
|
Chris@0
|
105 // Get field storages living in configuration. If we are explicitly looking
|
Chris@0
|
106 // for deleted storages only, this can be skipped, because they will be
|
Chris@14
|
107 // retrieved from the deleted fields repository below.
|
Chris@0
|
108 if (empty($conditions['deleted'])) {
|
Chris@0
|
109 if (isset($conditions['entity_type']) && isset($conditions['field_name'])) {
|
Chris@0
|
110 // Optimize for the most frequent case where we do have a specific ID.
|
Chris@0
|
111 $id = $conditions['entity_type'] . $conditions['field_name'];
|
Chris@0
|
112 $storages = $this->loadMultiple([$id]);
|
Chris@0
|
113 }
|
Chris@0
|
114 else {
|
Chris@0
|
115 // No specific ID, we need to examine all existing storages.
|
Chris@0
|
116 $storages = $this->loadMultiple();
|
Chris@0
|
117 }
|
Chris@0
|
118 }
|
Chris@0
|
119
|
Chris@14
|
120 // Merge deleted field storage definitions from the deleted fields
|
Chris@14
|
121 // repository if needed.
|
Chris@0
|
122 if ($include_deleted || !empty($conditions['deleted'])) {
|
Chris@14
|
123 $deleted_storage_definitions = $this->deletedFieldsRepository->getFieldStorageDefinitions();
|
Chris@14
|
124 foreach ($deleted_storage_definitions as $id => $field_storage_definition) {
|
Chris@14
|
125 if ($field_storage_definition instanceof FieldStorageConfigInterface) {
|
Chris@14
|
126 $storages[$id] = $field_storage_definition;
|
Chris@14
|
127 }
|
Chris@0
|
128 }
|
Chris@0
|
129 }
|
Chris@0
|
130
|
Chris@0
|
131 // Collect matching fields.
|
Chris@0
|
132 $matches = [];
|
Chris@0
|
133 foreach ($storages as $field) {
|
Chris@0
|
134 foreach ($conditions as $key => $value) {
|
Chris@0
|
135 // Extract the actual value against which the condition is checked.
|
Chris@0
|
136 $checked_value = $field->get($key);
|
Chris@0
|
137 // Skip to the next field as soon as one condition does not match.
|
Chris@0
|
138 if ($checked_value != $value) {
|
Chris@0
|
139 continue 2;
|
Chris@0
|
140 }
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 // When returning deleted fields, key the results by UUID since they can
|
Chris@0
|
144 // include several fields with the same ID.
|
Chris@0
|
145 $key = $include_deleted ? $field->uuid() : $field->id();
|
Chris@0
|
146 $matches[$key] = $field;
|
Chris@0
|
147 }
|
Chris@0
|
148
|
Chris@0
|
149 return $matches;
|
Chris@0
|
150 }
|
Chris@0
|
151
|
Chris@0
|
152 /**
|
Chris@0
|
153 * {@inheritdoc}
|
Chris@0
|
154 */
|
Chris@0
|
155 protected function mapFromStorageRecords(array $records) {
|
Chris@0
|
156 foreach ($records as $id => &$record) {
|
Chris@0
|
157 $class = $this->fieldTypeManager->getPluginClass($record['type']);
|
Chris@0
|
158 if (empty($class)) {
|
Chris@0
|
159 $config_id = $this->getPrefix() . $id;
|
Chris@0
|
160 throw new \RuntimeException("Unable to determine class for field type '{$record['type']}' found in the '$config_id' configuration");
|
Chris@0
|
161 }
|
Chris@0
|
162 $record['settings'] = $class::storageSettingsFromConfigData($record['settings']);
|
Chris@0
|
163 }
|
Chris@0
|
164 return parent::mapFromStorageRecords($records);
|
Chris@0
|
165 }
|
Chris@0
|
166
|
Chris@0
|
167 /**
|
Chris@0
|
168 * {@inheritdoc}
|
Chris@0
|
169 */
|
Chris@0
|
170 protected function mapToStorageRecord(EntityInterface $entity) {
|
Chris@0
|
171 $record = parent::mapToStorageRecord($entity);
|
Chris@0
|
172 $class = $this->fieldTypeManager->getPluginClass($record['type']);
|
Chris@0
|
173 $record['settings'] = $class::storageSettingsToConfigData($record['settings']);
|
Chris@0
|
174 return $record;
|
Chris@0
|
175 }
|
Chris@0
|
176
|
Chris@0
|
177 }
|