From 60e730afa61d87ee9969402c1c8f00b0464e71aa Mon Sep 17 00:00:00 2001 From: Willow Gillingham Date: Fri, 30 Apr 2021 17:55:10 +0000 Subject: [PATCH] added tokens to handle islandora > media operation --- islandora.tokens.inc | 124 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 islandora.tokens.inc diff --git a/islandora.tokens.inc b/islandora.tokens.inc new file mode 100644 index 00000000..e5561d63 --- /dev/null +++ b/islandora.tokens.inc @@ -0,0 +1,124 @@ + t('Islandora Tokens'), + 'description' => t('Tokens for Islandora objects.'), + ]; + $node['media-thumbnail-image:url'] = [ + 'name' => t('Media: Thumbnail Image URL.'), + 'description' => t('URL of Thumbnail Image associated with Islandora Object via Media.'), + ]; + + $node['media-thumbnail-image:alt'] = [ + 'name' => t('Alternative text for Media: Thumbnail Image.'), + 'description' => t('Alternative text for Thumbnail Image associated with Islandora Object via Media.'), + ]; + + // Deprecated in favour if hyphenated version. + $node['media_thumbnail_image:url'] = [ + 'name' => t('Media: Thumbnail Image URL.'), + 'description' => t('Deprecated: URL of Thumbnail Image associated with Islandora Object via Media.'), + ]; + + // Deprecated in favour if hyphenated version. + $node['media_thumbnail_image:alt'] = [ + 'name' => t('Alternative text for Media: Thumbnail Image.'), + 'description' => t('Deprecated: Alternative text for Thumbnail Image associated with Islandora Object via Media.'), + ]; + + + return [ + 'types' => ['islandoratokens' => $type], + 'tokens' => ['islandoratokens' => $node], + ]; +} + +/** + * Implements hook_tokens(). + */ +function islandora_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) { + $replacements = []; + if ($type == 'islandoratokens' && !empty($data['node'])) { + if (!is_array($tokens) || empty($tokens)) { + \Drupal::logger('controlled_access_terms') + ->alert('Tokens not correct format: @tokens', [ + '@tokens' => print_r($tokens, 1), + ]); + return; + } + foreach ($tokens as $name => $original) { + switch ($name) { + case 'media-thumbnail-image:url': + case 'media_thumbnail_image:url': + $term = $islandoraUtils->getTermForUri('http://pcdm.org/use#ThumbnailImage'); + $media = $islandoraUtils->getMediaWithTerm($data['node'], $term); + // Is there media? + // @todo: is this single or multiple? + if ($media) { + $file = controlled_access_terms_image_from_media($media); + if (!empty($file)) { + $url = $file->url(); + $replacements[$original] = $url; + } + } + break; + + case 'media-thumbnail-image:alt': + case 'media_thumbnail_image:alt': + $alt = ''; + $islandoraUtils = \Drupal::service('islandora.utils'); + $term = $islandoraUtils->getTermForUri('http://pcdm.org/use#ThumbnailImage'); + $media = $islandoraUtils->getMediaWithTerm($data['node'], $term); + // Is there media? + // @todo: is this single or multiple? + if ($media) { + // Is the media an image? + if (isset($media->field_media_image)) { + $alt = $media->field_media_image[0]->alt; + } + } + // @todo: get alt from original or service file, if thumbnail alt is empty. + $replacements[$original] = $alt; + break; + } + } + } + return $replacements; +} + +/** + * Get File referenced by given Media. + * + * @todo: Add to IslandoraUtils? + * @todo: Had to remove typehint MediaInterface from function. + * + * @param \Drupal\media\MediaInterface $media + * The Media to operate on. + * + * @return mixed + * \Drupal\file\FileInterface on success, NULL otherwise. + */ +function controlled_access_terms_image_from_media($media) { + $files = []; + if ($media->hasField('field_media_image')) { + $files = $media->get('field_media_image')->referencedEntities(); + } + return !empty($files) ? reset($files) : NULL; +} +