comparison core/modules/media/src/MediaSourceBase.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 1fec387a4317
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2
3 namespace Drupal\media;
4
5 use Drupal\Component\Utility\NestedArray;
6 use Drupal\Core\Entity\EntityFieldManagerInterface;
7 use Drupal\Core\Entity\EntityTypeManagerInterface;
8 use Drupal\Core\Field\FieldTypePluginManagerInterface;
9 use Drupal\Core\Form\FormStateInterface;
10 use Drupal\Core\Config\ConfigFactoryInterface;
11 use Drupal\Core\Plugin\PluginBase;
12 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
13 use Symfony\Component\DependencyInjection\ContainerInterface;
14
15 /**
16 * Base implementation of media source plugin.
17 */
18 abstract class MediaSourceBase extends PluginBase implements MediaSourceInterface, ContainerFactoryPluginInterface {
19
20 /**
21 * Plugin label.
22 *
23 * @var string
24 */
25 protected $label;
26
27 /**
28 * The entity type manager service.
29 *
30 * @var \Drupal\Core\Entity\EntityTypeManagerInterface
31 */
32 protected $entityTypeManager;
33
34 /**
35 * The entity field manager service.
36 *
37 * @var \Drupal\Core\Entity\EntityFieldManagerInterface
38 */
39 protected $entityFieldManager;
40
41 /**
42 * The field type plugin manager service.
43 *
44 * @var \Drupal\Core\Field\FieldTypePluginManagerInterface
45 */
46 protected $fieldTypeManager;
47
48 /**
49 * The config factory service.
50 *
51 * @var \Drupal\Core\Config\ConfigFactoryInterface
52 */
53 protected $configFactory;
54
55 /**
56 * Constructs a new class instance.
57 *
58 * @param array $configuration
59 * A configuration array containing information about the plugin instance.
60 * @param string $plugin_id
61 * The plugin_id for the plugin instance.
62 * @param mixed $plugin_definition
63 * The plugin implementation definition.
64 * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
65 * Entity type manager service.
66 * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
67 * Entity field manager service.
68 * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager
69 * The field type plugin manager service.
70 * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
71 * The config factory service.
72 */
73 public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, FieldTypePluginManagerInterface $field_type_manager, ConfigFactoryInterface $config_factory) {
74 parent::__construct($configuration, $plugin_id, $plugin_definition);
75 $this->entityTypeManager = $entity_type_manager;
76 $this->entityFieldManager = $entity_field_manager;
77 $this->fieldTypeManager = $field_type_manager;
78 $this->configFactory = $config_factory;
79
80 // Add the default configuration of the media source to the plugin.
81 $this->setConfiguration($configuration);
82 }
83
84 /**
85 * {@inheritdoc}
86 */
87 public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
88 return new static(
89 $configuration,
90 $plugin_id,
91 $plugin_definition,
92 $container->get('entity_type.manager'),
93 $container->get('entity_field.manager'),
94 $container->get('plugin.manager.field.field_type'),
95 $container->get('config.factory')
96 );
97 }
98
99 /**
100 * {@inheritdoc}
101 */
102 public function setConfiguration(array $configuration) {
103 $this->configuration = NestedArray::mergeDeep(
104 $this->defaultConfiguration(),
105 $configuration
106 );
107 }
108
109 /**
110 * {@inheritdoc}
111 */
112 public function getConfiguration() {
113 return $this->configuration;
114 }
115
116 /**
117 * {@inheritdoc}
118 */
119 public function defaultConfiguration() {
120 return [
121 'source_field' => '',
122 ];
123 }
124
125 /**
126 * {@inheritdoc}
127 */
128 public function getMetadata(MediaInterface $media, $attribute_name) {
129 switch ($attribute_name) {
130 case 'default_name':
131 return 'media:' . $media->bundle() . ':' . $media->uuid();
132
133 case 'thumbnail_uri':
134 $default_thumbnail_filename = $this->pluginDefinition['default_thumbnail_filename'];
135 return $this->configFactory->get('media.settings')->get('icon_base_uri') . '/' . $default_thumbnail_filename;
136 }
137
138 return NULL;
139 }
140
141 /**
142 * {@inheritdoc}
143 */
144 public function calculateDependencies() {
145 return [];
146 }
147
148 /**
149 * Get the source field options for the media type form.
150 *
151 * This returns all fields related to media entities, filtered by the allowed
152 * field types in the media source annotation.
153 *
154 * @return string[]
155 * A list of source field options for the media type form.
156 */
157 protected function getSourceFieldOptions() {
158 // If there are existing fields to choose from, allow the user to reuse one.
159 $options = [];
160 foreach ($this->entityFieldManager->getFieldStorageDefinitions('media') as $field_name => $field) {
161 $allowed_type = in_array($field->getType(), $this->pluginDefinition['allowed_field_types'], TRUE);
162 if ($allowed_type && !$field->isBaseField()) {
163 $options[$field_name] = $field->getLabel();
164 }
165 }
166 return $options;
167 }
168
169 /**
170 * {@inheritdoc}
171 */
172 public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
173 $options = $this->getSourceFieldOptions();
174 $form['source_field'] = [
175 '#type' => 'select',
176 '#title' => $this->t('Field with source information'),
177 '#default_value' => $this->configuration['source_field'],
178 '#empty_option' => $this->t('- Create -'),
179 '#options' => $options,
180 '#description' => $this->t('Select the field that will store essential information about the media item. If "Create" is selected a new field will be automatically created.'),
181 ];
182
183 if (!$options && $form_state->get('operation') === 'add') {
184 $form['source_field']['#access'] = FALSE;
185 $field_definition = $this->fieldTypeManager->getDefinition(reset($this->pluginDefinition['allowed_field_types']));
186 $form['source_field_message'] = [
187 '#markup' => $this->t('%field_type field will be automatically created on this type to store the essential information about the media item.', [
188 '%field_type' => $field_definition['label'],
189 ]),
190 ];
191 }
192 elseif ($form_state->get('operation') === 'edit') {
193 $form['source_field']['#access'] = FALSE;
194 $fields = $this->entityFieldManager->getFieldDefinitions('media', $form_state->get('type')->id());
195 $form['source_field_message'] = [
196 '#markup' => $this->t('%field_name field is used to store the essential information about the media item.', [
197 '%field_name' => $fields[$this->configuration['source_field']]->getLabel(),
198 ]),
199 ];
200 }
201
202 return $form;
203 }
204
205 /**
206 * {@inheritdoc}
207 */
208 public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
209 }
210
211 /**
212 * {@inheritdoc}
213 */
214 public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
215 foreach (array_intersect_key($form_state->getValues(), $this->configuration) as $config_key => $config_value) {
216 $this->configuration[$config_key] = $config_value;
217 }
218
219 // If no source field is explicitly set, create it now.
220 if (empty($this->configuration['source_field'])) {
221 $field_storage = $this->createSourceFieldStorage();
222 $field_storage->save();
223 $this->configuration['source_field'] = $field_storage->getName();
224 }
225 }
226
227 /**
228 * Creates the source field storage definition.
229 *
230 * By default, the first field type listed in the plugin definition's
231 * allowed_field_types array will be the generated field's type.
232 *
233 * @return \Drupal\field\FieldStorageConfigInterface
234 * The unsaved field storage definition.
235 */
236 protected function createSourceFieldStorage() {
237 return $this->entityTypeManager
238 ->getStorage('field_storage_config')
239 ->create([
240 'entity_type' => 'media',
241 'field_name' => $this->getSourceFieldName(),
242 'type' => reset($this->pluginDefinition['allowed_field_types']),
243 ]);
244 }
245
246 /**
247 * Returns the source field storage definition.
248 *
249 * @return \Drupal\Core\Field\FieldStorageDefinitionInterface|null
250 * The field storage definition or NULL if it doesn't exists.
251 */
252 protected function getSourceFieldStorage() {
253 // Nothing to do if no source field is configured yet.
254 $field = $this->configuration['source_field'];
255 if ($field) {
256 // Even if we do know the name of the source field, there's no
257 // guarantee that it exists.
258 $fields = $this->entityFieldManager->getFieldStorageDefinitions('media');
259 return isset($fields[$field]) ? $fields[$field] : NULL;
260 }
261 return NULL;
262 }
263
264 /**
265 * {@inheritdoc}
266 */
267 public function getSourceFieldDefinition(MediaTypeInterface $type) {
268 // Nothing to do if no source field is configured yet.
269 $field = $this->configuration['source_field'];
270 if ($field) {
271 // Even if we do know the name of the source field, there is no
272 // guarantee that it already exists.
273 $fields = $this->entityFieldManager->getFieldDefinitions('media', $type->id());
274 return isset($fields[$field]) ? $fields[$field] : NULL;
275 }
276 return NULL;
277 }
278
279 /**
280 * {@inheritdoc}
281 */
282 public function createSourceField(MediaTypeInterface $type) {
283 $storage = $this->getSourceFieldStorage() ?: $this->createSourceFieldStorage();
284 return $this->entityTypeManager
285 ->getStorage('field_config')
286 ->create([
287 'field_storage' => $storage,
288 'bundle' => $type->id(),
289 'label' => $this->pluginDefinition['label'],
290 'required' => TRUE,
291 ]);
292 }
293
294 /**
295 * Determine the name of the source field.
296 *
297 * @return string
298 * The source field name. If one is already stored in configuration, it is
299 * returned. Otherwise, a new, unused one is generated.
300 */
301 protected function getSourceFieldName() {
302 $base_id = 'field_media_' . $this->getPluginId();
303 $tries = 0;
304 $storage = $this->entityTypeManager->getStorage('field_storage_config');
305
306 // Iterate at least once, until no field with the generated ID is found.
307 do {
308 $id = $base_id;
309 // If we've tried before, increment and append the suffix.
310 if ($tries) {
311 $id .= '_' . $tries;
312 }
313 $field = $storage->load('media.' . $id);
314 $tries++;
315 } while ($field);
316
317 return $id;
318 }
319
320 }