Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\media\Entity;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Entity\EditorialContentEntityBase;
|
Chris@0
|
6 use Drupal\Core\Entity\EntityStorageInterface;
|
Chris@0
|
7 use Drupal\Core\Entity\EntityTypeInterface;
|
Chris@0
|
8 use Drupal\Core\Field\BaseFieldDefinition;
|
Chris@0
|
9 use Drupal\Core\StringTranslation\StringTranslationTrait;
|
Chris@0
|
10 use Drupal\media\MediaInterface;
|
Chris@0
|
11 use Drupal\media\MediaSourceEntityConstraintsInterface;
|
Chris@0
|
12 use Drupal\media\MediaSourceFieldConstraintsInterface;
|
Chris@18
|
13 use Drupal\user\EntityOwnerTrait;
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * Defines the media entity class.
|
Chris@0
|
17 *
|
Chris@0
|
18 * @todo Remove default/fallback entity form operation when #2006348 is done.
|
Chris@0
|
19 * @see https://www.drupal.org/node/2006348.
|
Chris@0
|
20 *
|
Chris@0
|
21 * @ContentEntityType(
|
Chris@0
|
22 * id = "media",
|
Chris@0
|
23 * label = @Translation("Media"),
|
Chris@0
|
24 * label_singular = @Translation("media item"),
|
Chris@0
|
25 * label_plural = @Translation("media items"),
|
Chris@0
|
26 * label_count = @PluralTranslation(
|
Chris@0
|
27 * singular = "@count media item",
|
Chris@0
|
28 * plural = "@count media items"
|
Chris@0
|
29 * ),
|
Chris@0
|
30 * bundle_label = @Translation("Media type"),
|
Chris@0
|
31 * handlers = {
|
Chris@17
|
32 * "storage" = "Drupal\media\MediaStorage",
|
Chris@0
|
33 * "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
|
Chris@14
|
34 * "list_builder" = "Drupal\media\MediaListBuilder",
|
Chris@0
|
35 * "access" = "Drupal\media\MediaAccessControlHandler",
|
Chris@0
|
36 * "form" = {
|
Chris@0
|
37 * "default" = "Drupal\media\MediaForm",
|
Chris@0
|
38 * "add" = "Drupal\media\MediaForm",
|
Chris@0
|
39 * "edit" = "Drupal\media\MediaForm",
|
Chris@0
|
40 * "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
|
Chris@17
|
41 * "delete-multiple-confirm" = "Drupal\Core\Entity\Form\DeleteMultipleForm",
|
Chris@0
|
42 * },
|
Chris@0
|
43 * "translation" = "Drupal\content_translation\ContentTranslationHandler",
|
Chris@0
|
44 * "views_data" = "Drupal\media\MediaViewsData",
|
Chris@0
|
45 * "route_provider" = {
|
Chris@18
|
46 * "html" = "Drupal\media\Routing\MediaRouteProvider",
|
Chris@0
|
47 * }
|
Chris@0
|
48 * },
|
Chris@0
|
49 * base_table = "media",
|
Chris@0
|
50 * data_table = "media_field_data",
|
Chris@0
|
51 * revision_table = "media_revision",
|
Chris@0
|
52 * revision_data_table = "media_field_revision",
|
Chris@0
|
53 * translatable = TRUE,
|
Chris@0
|
54 * show_revision_ui = TRUE,
|
Chris@0
|
55 * entity_keys = {
|
Chris@0
|
56 * "id" = "mid",
|
Chris@0
|
57 * "revision" = "vid",
|
Chris@0
|
58 * "bundle" = "bundle",
|
Chris@0
|
59 * "label" = "name",
|
Chris@0
|
60 * "langcode" = "langcode",
|
Chris@0
|
61 * "uuid" = "uuid",
|
Chris@0
|
62 * "published" = "status",
|
Chris@18
|
63 * "owner" = "uid",
|
Chris@0
|
64 * },
|
Chris@0
|
65 * revision_metadata_keys = {
|
Chris@0
|
66 * "revision_user" = "revision_user",
|
Chris@0
|
67 * "revision_created" = "revision_created",
|
Chris@0
|
68 * "revision_log_message" = "revision_log_message",
|
Chris@0
|
69 * },
|
Chris@0
|
70 * bundle_entity_type = "media_type",
|
Chris@14
|
71 * permission_granularity = "bundle",
|
Chris@0
|
72 * admin_permission = "administer media",
|
Chris@0
|
73 * field_ui_base_route = "entity.media_type.edit_form",
|
Chris@0
|
74 * common_reference_target = TRUE,
|
Chris@0
|
75 * links = {
|
Chris@0
|
76 * "add-page" = "/media/add",
|
Chris@0
|
77 * "add-form" = "/media/add/{media_type}",
|
Chris@18
|
78 * "canonical" = "/media/{media}/edit",
|
Chris@14
|
79 * "collection" = "/admin/content/media",
|
Chris@0
|
80 * "delete-form" = "/media/{media}/delete",
|
Chris@17
|
81 * "delete-multiple-form" = "/media/delete",
|
Chris@0
|
82 * "edit-form" = "/media/{media}/edit",
|
Chris@0
|
83 * "revision" = "/media/{media}/revisions/{media_revision}/view",
|
Chris@0
|
84 * }
|
Chris@0
|
85 * )
|
Chris@0
|
86 */
|
Chris@0
|
87 class Media extends EditorialContentEntityBase implements MediaInterface {
|
Chris@0
|
88
|
Chris@18
|
89 use EntityOwnerTrait;
|
Chris@0
|
90 use StringTranslationTrait;
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@0
|
93 * {@inheritdoc}
|
Chris@0
|
94 */
|
Chris@0
|
95 public function getName() {
|
Chris@17
|
96 $name = $this->getEntityKey('label');
|
Chris@0
|
97
|
Chris@17
|
98 if (empty($name)) {
|
Chris@0
|
99 $media_source = $this->getSource();
|
Chris@0
|
100 return $media_source->getMetadata($this, $media_source->getPluginDefinition()['default_name_metadata_attribute']);
|
Chris@0
|
101 }
|
Chris@17
|
102
|
Chris@17
|
103 return $name;
|
Chris@0
|
104 }
|
Chris@0
|
105
|
Chris@0
|
106 /**
|
Chris@0
|
107 * {@inheritdoc}
|
Chris@0
|
108 */
|
Chris@0
|
109 public function label() {
|
Chris@0
|
110 return $this->getName();
|
Chris@0
|
111 }
|
Chris@0
|
112
|
Chris@0
|
113 /**
|
Chris@0
|
114 * {@inheritdoc}
|
Chris@0
|
115 */
|
Chris@0
|
116 public function setName($name) {
|
Chris@0
|
117 return $this->set('name', $name);
|
Chris@0
|
118 }
|
Chris@0
|
119
|
Chris@0
|
120 /**
|
Chris@0
|
121 * {@inheritdoc}
|
Chris@0
|
122 */
|
Chris@0
|
123 public function getCreatedTime() {
|
Chris@0
|
124 return $this->get('created')->value;
|
Chris@0
|
125 }
|
Chris@0
|
126
|
Chris@0
|
127 /**
|
Chris@0
|
128 * {@inheritdoc}
|
Chris@0
|
129 */
|
Chris@0
|
130 public function setCreatedTime($timestamp) {
|
Chris@0
|
131 return $this->set('created', $timestamp);
|
Chris@0
|
132 }
|
Chris@0
|
133
|
Chris@0
|
134 /**
|
Chris@0
|
135 * {@inheritdoc}
|
Chris@0
|
136 */
|
Chris@0
|
137 public function getSource() {
|
Chris@0
|
138 return $this->bundle->entity->getSource();
|
Chris@0
|
139 }
|
Chris@0
|
140
|
Chris@0
|
141 /**
|
Chris@0
|
142 * Update the thumbnail for the media item.
|
Chris@0
|
143 *
|
Chris@0
|
144 * @param bool $from_queue
|
Chris@0
|
145 * Specifies whether the thumbnail update is triggered from the queue.
|
Chris@0
|
146 *
|
Chris@0
|
147 * @return \Drupal\media\MediaInterface
|
Chris@0
|
148 * The updated media item.
|
Chris@0
|
149 *
|
Chris@0
|
150 * @internal
|
Chris@0
|
151 *
|
Chris@0
|
152 * @todo There has been some disagreement about how to handle updates to
|
Chris@0
|
153 * thumbnails. We need to decide on what the API will be for this.
|
Chris@0
|
154 * https://www.drupal.org/node/2878119
|
Chris@0
|
155 */
|
Chris@0
|
156 protected function updateThumbnail($from_queue = FALSE) {
|
Chris@17
|
157 $this->thumbnail->target_id = $this->loadThumbnail($this->getThumbnailUri($from_queue))->id();
|
Chris@0
|
158
|
Chris@17
|
159 // Set the thumbnail alt.
|
Chris@17
|
160 $media_source = $this->getSource();
|
Chris@17
|
161 $plugin_definition = $media_source->getPluginDefinition();
|
Chris@17
|
162
|
Chris@17
|
163 $this->thumbnail->alt = '';
|
Chris@17
|
164 if (!empty($plugin_definition['thumbnail_alt_metadata_attribute'])) {
|
Chris@17
|
165 $this->thumbnail->alt = $media_source->getMetadata($this, $plugin_definition['thumbnail_alt_metadata_attribute']);
|
Chris@17
|
166 }
|
Chris@17
|
167
|
Chris@17
|
168 return $this;
|
Chris@17
|
169 }
|
Chris@17
|
170
|
Chris@17
|
171 /**
|
Chris@17
|
172 * Loads the file entity for the thumbnail.
|
Chris@17
|
173 *
|
Chris@17
|
174 * If the file entity does not exist, it will be created.
|
Chris@17
|
175 *
|
Chris@17
|
176 * @param string $thumbnail_uri
|
Chris@17
|
177 * (optional) The URI of the thumbnail, used to load or create the file
|
Chris@17
|
178 * entity. If omitted, the default thumbnail URI will be used.
|
Chris@17
|
179 *
|
Chris@17
|
180 * @return \Drupal\file\FileInterface
|
Chris@17
|
181 * The thumbnail file entity.
|
Chris@17
|
182 */
|
Chris@17
|
183 protected function loadThumbnail($thumbnail_uri = NULL) {
|
Chris@17
|
184 $values = [
|
Chris@17
|
185 'uri' => $thumbnail_uri ?: $this->getDefaultThumbnailUri(),
|
Chris@17
|
186 ];
|
Chris@17
|
187
|
Chris@17
|
188 $file_storage = $this->entityTypeManager()->getStorage('file');
|
Chris@17
|
189
|
Chris@17
|
190 $existing = $file_storage->loadByProperties($values);
|
Chris@0
|
191 if ($existing) {
|
Chris@17
|
192 $file = reset($existing);
|
Chris@0
|
193 }
|
Chris@0
|
194 else {
|
Chris@0
|
195 /** @var \Drupal\file\FileInterface $file */
|
Chris@17
|
196 $file = $file_storage->create($values);
|
Chris@0
|
197 if ($owner = $this->getOwner()) {
|
Chris@0
|
198 $file->setOwner($owner);
|
Chris@0
|
199 }
|
Chris@0
|
200 $file->setPermanent();
|
Chris@0
|
201 $file->save();
|
Chris@0
|
202 }
|
Chris@17
|
203 return $file;
|
Chris@17
|
204 }
|
Chris@0
|
205
|
Chris@17
|
206 /**
|
Chris@17
|
207 * Returns the URI of the default thumbnail.
|
Chris@17
|
208 *
|
Chris@17
|
209 * @return string
|
Chris@17
|
210 * The default thumbnail URI.
|
Chris@17
|
211 */
|
Chris@17
|
212 protected function getDefaultThumbnailUri() {
|
Chris@17
|
213 $default_thumbnail_filename = $this->getSource()->getPluginDefinition()['default_thumbnail_filename'];
|
Chris@17
|
214 return \Drupal::config('media.settings')->get('icon_base_uri') . '/' . $default_thumbnail_filename;
|
Chris@0
|
215 }
|
Chris@0
|
216
|
Chris@0
|
217 /**
|
Chris@0
|
218 * Updates the queued thumbnail for the media item.
|
Chris@0
|
219 *
|
Chris@0
|
220 * @return \Drupal\media\MediaInterface
|
Chris@0
|
221 * The updated media item.
|
Chris@0
|
222 *
|
Chris@0
|
223 * @internal
|
Chris@0
|
224 *
|
Chris@0
|
225 * @todo If the need arises in contrib, consider making this a public API,
|
Chris@0
|
226 * by adding an interface that extends MediaInterface.
|
Chris@0
|
227 */
|
Chris@0
|
228 public function updateQueuedThumbnail() {
|
Chris@0
|
229 $this->updateThumbnail(TRUE);
|
Chris@0
|
230 return $this;
|
Chris@0
|
231 }
|
Chris@0
|
232
|
Chris@0
|
233 /**
|
Chris@0
|
234 * Gets the URI for the thumbnail of a media item.
|
Chris@0
|
235 *
|
Chris@0
|
236 * If thumbnail fetching is queued, new media items will use the default
|
Chris@0
|
237 * thumbnail, and existing media items will use the current thumbnail, until
|
Chris@0
|
238 * the queue is processed and the updated thumbnail has been fetched.
|
Chris@0
|
239 * Otherwise, the new thumbnail will be fetched immediately.
|
Chris@0
|
240 *
|
Chris@0
|
241 * @param bool $from_queue
|
Chris@0
|
242 * Specifies whether the thumbnail is being fetched from the queue.
|
Chris@0
|
243 *
|
Chris@0
|
244 * @return string
|
Chris@0
|
245 * The file URI for the thumbnail of the media item.
|
Chris@0
|
246 *
|
Chris@0
|
247 * @internal
|
Chris@0
|
248 */
|
Chris@0
|
249 protected function getThumbnailUri($from_queue) {
|
Chris@0
|
250 $thumbnails_queued = $this->bundle->entity->thumbnailDownloadsAreQueued();
|
Chris@0
|
251 if ($thumbnails_queued && $this->isNew()) {
|
Chris@17
|
252 return $this->getDefaultThumbnailUri();
|
Chris@0
|
253 }
|
Chris@0
|
254 elseif ($thumbnails_queued && !$from_queue) {
|
Chris@17
|
255 return $this->get('thumbnail')->entity->getFileUri();
|
Chris@0
|
256 }
|
Chris@0
|
257
|
Chris@17
|
258 $source = $this->getSource();
|
Chris@17
|
259 return $source->getMetadata($this, $source->getPluginDefinition()['thumbnail_uri_metadata_attribute']);
|
Chris@0
|
260 }
|
Chris@0
|
261
|
Chris@0
|
262 /**
|
Chris@0
|
263 * Determines if the source field value has changed.
|
Chris@0
|
264 *
|
Chris@0
|
265 * @return bool
|
Chris@0
|
266 * TRUE if the source field value changed, FALSE otherwise.
|
Chris@0
|
267 *
|
Chris@0
|
268 * @internal
|
Chris@0
|
269 */
|
Chris@0
|
270 protected function hasSourceFieldChanged() {
|
Chris@0
|
271 $source_field_name = $this->getSource()->getConfiguration()['source_field'];
|
Chris@0
|
272 $current_items = $this->get($source_field_name);
|
Chris@0
|
273 return isset($this->original) && !$current_items->equals($this->original->get($source_field_name));
|
Chris@0
|
274 }
|
Chris@0
|
275
|
Chris@0
|
276 /**
|
Chris@0
|
277 * Determines if the thumbnail should be updated for a media item.
|
Chris@0
|
278 *
|
Chris@0
|
279 * @param bool $is_new
|
Chris@0
|
280 * Specifies whether the media item is new.
|
Chris@0
|
281 *
|
Chris@0
|
282 * @return bool
|
Chris@0
|
283 * TRUE if the thumbnail should be updated, FALSE otherwise.
|
Chris@0
|
284 */
|
Chris@0
|
285 protected function shouldUpdateThumbnail($is_new = FALSE) {
|
Chris@0
|
286 // Update thumbnail if we don't have a thumbnail yet or when the source
|
Chris@0
|
287 // field value changes.
|
Chris@0
|
288 return !$this->get('thumbnail')->entity || $is_new || $this->hasSourceFieldChanged();
|
Chris@0
|
289 }
|
Chris@0
|
290
|
Chris@0
|
291 /**
|
Chris@0
|
292 * {@inheritdoc}
|
Chris@0
|
293 */
|
Chris@0
|
294 public function preSave(EntityStorageInterface $storage) {
|
Chris@0
|
295 parent::preSave($storage);
|
Chris@0
|
296
|
Chris@17
|
297 // If no thumbnail has been explicitly set, use the default thumbnail.
|
Chris@17
|
298 if ($this->get('thumbnail')->isEmpty()) {
|
Chris@17
|
299 $this->thumbnail->target_id = $this->loadThumbnail()->id();
|
Chris@0
|
300 }
|
Chris@0
|
301 }
|
Chris@0
|
302
|
Chris@0
|
303 /**
|
Chris@0
|
304 * {@inheritdoc}
|
Chris@0
|
305 */
|
Chris@0
|
306 public function postSave(EntityStorageInterface $storage, $update = TRUE) {
|
Chris@0
|
307 parent::postSave($storage, $update);
|
Chris@0
|
308 $is_new = !$update;
|
Chris@0
|
309 foreach ($this->translations as $langcode => $data) {
|
Chris@0
|
310 if ($this->hasTranslation($langcode)) {
|
Chris@0
|
311 $translation = $this->getTranslation($langcode);
|
Chris@0
|
312 if ($translation->bundle->entity->thumbnailDownloadsAreQueued() && $translation->shouldUpdateThumbnail($is_new)) {
|
Chris@0
|
313 \Drupal::queue('media_entity_thumbnail')->createItem(['id' => $translation->id()]);
|
Chris@0
|
314 }
|
Chris@0
|
315 }
|
Chris@0
|
316 }
|
Chris@0
|
317 }
|
Chris@0
|
318
|
Chris@0
|
319 /**
|
Chris@0
|
320 * {@inheritdoc}
|
Chris@0
|
321 */
|
Chris@0
|
322 public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) {
|
Chris@0
|
323 parent::preSaveRevision($storage, $record);
|
Chris@0
|
324
|
Chris@0
|
325 $is_new_revision = $this->isNewRevision();
|
Chris@0
|
326 if (!$is_new_revision && isset($this->original) && empty($record->revision_log_message)) {
|
Chris@0
|
327 // If we are updating an existing media item without adding a
|
Chris@0
|
328 // new revision, we need to make sure $entity->revision_log_message is
|
Chris@0
|
329 // reset whenever it is empty.
|
Chris@0
|
330 // Therefore, this code allows us to avoid clobbering an existing log
|
Chris@0
|
331 // entry with an empty one.
|
Chris@0
|
332 $record->revision_log_message = $this->original->revision_log_message->value;
|
Chris@0
|
333 }
|
Chris@0
|
334
|
Chris@0
|
335 if ($is_new_revision) {
|
Chris@0
|
336 $record->revision_created = self::getRequestTime();
|
Chris@0
|
337 }
|
Chris@0
|
338 }
|
Chris@0
|
339
|
Chris@0
|
340 /**
|
Chris@17
|
341 * Sets the media entity's field values from the source's metadata.
|
Chris@17
|
342 *
|
Chris@17
|
343 * Fetching the metadata could be slow (e.g., if requesting it from a remote
|
Chris@17
|
344 * API), so this is called by \Drupal\media\MediaStorage::save() prior to it
|
Chris@17
|
345 * beginning the database transaction, whereas static::preSave() executes
|
Chris@17
|
346 * after the transaction has already started.
|
Chris@17
|
347 *
|
Chris@17
|
348 * @internal
|
Chris@17
|
349 * Expose this as an API in
|
Chris@17
|
350 * https://www.drupal.org/project/drupal/issues/2992426.
|
Chris@17
|
351 */
|
Chris@17
|
352 public function prepareSave() {
|
Chris@17
|
353 // @todo If the source plugin talks to a remote API (e.g. oEmbed), this code
|
Chris@17
|
354 // might be performing a fair number of HTTP requests. This is dangerously
|
Chris@17
|
355 // brittle and should probably be handled by a queue, to avoid doing HTTP
|
Chris@17
|
356 // operations during entity save. See
|
Chris@17
|
357 // https://www.drupal.org/project/drupal/issues/2976875 for more.
|
Chris@17
|
358
|
Chris@17
|
359 // In order for metadata to be mapped correctly, $this->original must be
|
Chris@17
|
360 // set. However, that is only set once parent::save() is called, so work
|
Chris@17
|
361 // around that by setting it here.
|
Chris@17
|
362 if (!isset($this->original) && $id = $this->id()) {
|
Chris@17
|
363 $this->original = $this->entityTypeManager()
|
Chris@17
|
364 ->getStorage('media')
|
Chris@17
|
365 ->loadUnchanged($id);
|
Chris@17
|
366 }
|
Chris@17
|
367
|
Chris@17
|
368 $media_source = $this->getSource();
|
Chris@17
|
369 foreach ($this->translations as $langcode => $data) {
|
Chris@17
|
370 if ($this->hasTranslation($langcode)) {
|
Chris@17
|
371 $translation = $this->getTranslation($langcode);
|
Chris@17
|
372 // Try to set fields provided by the media source and mapped in
|
Chris@17
|
373 // media type config.
|
Chris@17
|
374 foreach ($translation->bundle->entity->getFieldMap() as $metadata_attribute_name => $entity_field_name) {
|
Chris@17
|
375 // Only save value in entity field if empty. Do not overwrite existing
|
Chris@17
|
376 // data.
|
Chris@17
|
377 if ($translation->hasField($entity_field_name) && ($translation->get($entity_field_name)->isEmpty() || $translation->hasSourceFieldChanged())) {
|
Chris@17
|
378 $translation->set($entity_field_name, $media_source->getMetadata($translation, $metadata_attribute_name));
|
Chris@17
|
379 }
|
Chris@17
|
380 }
|
Chris@17
|
381
|
Chris@17
|
382 // Try to set a default name for this media item if no name is provided.
|
Chris@17
|
383 if ($translation->get('name')->isEmpty()) {
|
Chris@17
|
384 $translation->setName($translation->getName());
|
Chris@17
|
385 }
|
Chris@17
|
386
|
Chris@17
|
387 // Set thumbnail.
|
Chris@17
|
388 if ($translation->shouldUpdateThumbnail($this->isNew())) {
|
Chris@17
|
389 $translation->updateThumbnail();
|
Chris@17
|
390 }
|
Chris@17
|
391 }
|
Chris@17
|
392 }
|
Chris@17
|
393 }
|
Chris@17
|
394
|
Chris@17
|
395 /**
|
Chris@0
|
396 * {@inheritdoc}
|
Chris@0
|
397 */
|
Chris@0
|
398 public function validate() {
|
Chris@0
|
399 $media_source = $this->getSource();
|
Chris@0
|
400
|
Chris@0
|
401 if ($media_source instanceof MediaSourceEntityConstraintsInterface) {
|
Chris@0
|
402 $entity_constraints = $media_source->getEntityConstraints();
|
Chris@0
|
403 $this->getTypedData()->getDataDefinition()->setConstraints($entity_constraints);
|
Chris@0
|
404 }
|
Chris@0
|
405
|
Chris@0
|
406 if ($media_source instanceof MediaSourceFieldConstraintsInterface) {
|
Chris@0
|
407 $source_field_name = $media_source->getConfiguration()['source_field'];
|
Chris@0
|
408 $source_field_constraints = $media_source->getSourceFieldConstraints();
|
Chris@0
|
409 $this->get($source_field_name)->getDataDefinition()->setConstraints($source_field_constraints);
|
Chris@0
|
410 }
|
Chris@0
|
411
|
Chris@0
|
412 return parent::validate();
|
Chris@0
|
413 }
|
Chris@0
|
414
|
Chris@0
|
415 /**
|
Chris@0
|
416 * {@inheritdoc}
|
Chris@0
|
417 */
|
Chris@0
|
418 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
|
Chris@0
|
419 $fields = parent::baseFieldDefinitions($entity_type);
|
Chris@18
|
420 $fields += static::ownerBaseFieldDefinitions($entity_type);
|
Chris@0
|
421
|
Chris@0
|
422 $fields['name'] = BaseFieldDefinition::create('string')
|
Chris@0
|
423 ->setLabel(t('Name'))
|
Chris@0
|
424 ->setRequired(TRUE)
|
Chris@0
|
425 ->setTranslatable(TRUE)
|
Chris@0
|
426 ->setRevisionable(TRUE)
|
Chris@0
|
427 ->setDefaultValue('')
|
Chris@0
|
428 ->setSetting('max_length', 255)
|
Chris@0
|
429 ->setDisplayOptions('form', [
|
Chris@0
|
430 'type' => 'string_textfield',
|
Chris@0
|
431 'weight' => -5,
|
Chris@0
|
432 ])
|
Chris@0
|
433 ->setDisplayConfigurable('form', TRUE)
|
Chris@14
|
434 ->setDisplayConfigurable('view', TRUE);
|
Chris@0
|
435
|
Chris@0
|
436 $fields['thumbnail'] = BaseFieldDefinition::create('image')
|
Chris@0
|
437 ->setLabel(t('Thumbnail'))
|
Chris@0
|
438 ->setDescription(t('The thumbnail of the media item.'))
|
Chris@0
|
439 ->setRevisionable(TRUE)
|
Chris@0
|
440 ->setTranslatable(TRUE)
|
Chris@0
|
441 ->setDisplayOptions('view', [
|
Chris@0
|
442 'type' => 'image',
|
Chris@0
|
443 'weight' => 5,
|
Chris@0
|
444 'label' => 'hidden',
|
Chris@0
|
445 'settings' => [
|
Chris@0
|
446 'image_style' => 'thumbnail',
|
Chris@0
|
447 ],
|
Chris@0
|
448 ])
|
Chris@0
|
449 ->setDisplayConfigurable('view', TRUE)
|
Chris@0
|
450 ->setReadOnly(TRUE);
|
Chris@0
|
451
|
Chris@18
|
452 $fields['uid']
|
Chris@0
|
453 ->setLabel(t('Authored by'))
|
Chris@0
|
454 ->setDescription(t('The user ID of the author.'))
|
Chris@0
|
455 ->setRevisionable(TRUE)
|
Chris@0
|
456 ->setDisplayOptions('form', [
|
Chris@0
|
457 'type' => 'entity_reference_autocomplete',
|
Chris@0
|
458 'weight' => 5,
|
Chris@0
|
459 'settings' => [
|
Chris@0
|
460 'match_operator' => 'CONTAINS',
|
Chris@0
|
461 'size' => '60',
|
Chris@0
|
462 'autocomplete_type' => 'tags',
|
Chris@0
|
463 'placeholder' => '',
|
Chris@0
|
464 ],
|
Chris@0
|
465 ])
|
Chris@0
|
466 ->setDisplayConfigurable('form', TRUE)
|
Chris@0
|
467 ->setDisplayOptions('view', [
|
Chris@0
|
468 'label' => 'hidden',
|
Chris@0
|
469 'type' => 'author',
|
Chris@0
|
470 'weight' => 0,
|
Chris@0
|
471 ])
|
Chris@0
|
472 ->setDisplayConfigurable('view', TRUE);
|
Chris@0
|
473
|
Chris@0
|
474 $fields['status']
|
Chris@0
|
475 ->setDisplayOptions('form', [
|
Chris@0
|
476 'type' => 'boolean_checkbox',
|
Chris@0
|
477 'settings' => [
|
Chris@0
|
478 'display_label' => TRUE,
|
Chris@0
|
479 ],
|
Chris@0
|
480 'weight' => 100,
|
Chris@0
|
481 ])
|
Chris@0
|
482 ->setDisplayConfigurable('form', TRUE);
|
Chris@0
|
483
|
Chris@0
|
484 $fields['created'] = BaseFieldDefinition::create('created')
|
Chris@0
|
485 ->setLabel(t('Authored on'))
|
Chris@0
|
486 ->setDescription(t('The time the media item was created.'))
|
Chris@0
|
487 ->setTranslatable(TRUE)
|
Chris@0
|
488 ->setRevisionable(TRUE)
|
Chris@0
|
489 ->setDefaultValueCallback(static::class . '::getRequestTime')
|
Chris@0
|
490 ->setDisplayOptions('form', [
|
Chris@0
|
491 'type' => 'datetime_timestamp',
|
Chris@0
|
492 'weight' => 10,
|
Chris@0
|
493 ])
|
Chris@0
|
494 ->setDisplayConfigurable('form', TRUE)
|
Chris@0
|
495 ->setDisplayOptions('view', [
|
Chris@0
|
496 'label' => 'hidden',
|
Chris@0
|
497 'type' => 'timestamp',
|
Chris@0
|
498 'weight' => 0,
|
Chris@0
|
499 ])
|
Chris@0
|
500 ->setDisplayConfigurable('view', TRUE);
|
Chris@0
|
501
|
Chris@0
|
502 $fields['changed'] = BaseFieldDefinition::create('changed')
|
Chris@0
|
503 ->setLabel(t('Changed'))
|
Chris@0
|
504 ->setDescription(t('The time the media item was last edited.'))
|
Chris@0
|
505 ->setTranslatable(TRUE)
|
Chris@0
|
506 ->setRevisionable(TRUE);
|
Chris@0
|
507
|
Chris@0
|
508 return $fields;
|
Chris@0
|
509 }
|
Chris@0
|
510
|
Chris@0
|
511 /**
|
Chris@0
|
512 * Default value callback for 'uid' base field definition.
|
Chris@0
|
513 *
|
Chris@0
|
514 * @see ::baseFieldDefinitions()
|
Chris@0
|
515 *
|
Chris@18
|
516 * @deprecated The ::getCurrentUserId method is deprecated in 8.6.x and will
|
Chris@18
|
517 * be removed before 9.0.0.
|
Chris@18
|
518 *
|
Chris@0
|
519 * @return int[]
|
Chris@0
|
520 * An array of default values.
|
Chris@0
|
521 */
|
Chris@0
|
522 public static function getCurrentUserId() {
|
Chris@18
|
523 @trigger_error('The ::getCurrentUserId method is deprecated in 8.6.x and will be removed before 9.0.0.', E_USER_DEPRECATED);
|
Chris@0
|
524 return [\Drupal::currentUser()->id()];
|
Chris@0
|
525 }
|
Chris@0
|
526
|
Chris@0
|
527 /**
|
Chris@0
|
528 * {@inheritdoc}
|
Chris@0
|
529 */
|
Chris@0
|
530 public static function getRequestTime() {
|
Chris@0
|
531 return \Drupal::time()->getRequestTime();
|
Chris@0
|
532 }
|
Chris@0
|
533
|
Chris@0
|
534 }
|