diff --git a/islandora.tokens.inc b/islandora.tokens.inc index 78f75aa6..8d1c4b6b 100644 --- a/islandora.tokens.inc +++ b/islandora.tokens.inc @@ -8,6 +8,8 @@ */ use Drupal\Core\Render\BubbleableMetadata; +use Drupal\media\Entity\Media; +use Drupal\file\Entity\File; /** * Implements hook_token_info(). @@ -39,6 +41,11 @@ function islandora_token_info() { 'description' => t('Deprecated: Alternative text for Thumbnail Image associated with Islandora Object via Media.'), ]; + $node['pdf_url'] = [ + 'name' => t("PDF Url"), + 'description' => t('URL to related media file if "Original file" is a PDF file'), + ]; + return [ 'types' => ['islandoratokens' => $type], 'tokens' => ['islandoratokens' => $node], @@ -95,8 +102,60 @@ function islandora_tokens($type, $tokens, array $data, array $options, Bubbleabl // alt is empty. $replacements[$original] = $alt; break; + + case 'pdf_url': + $replacements[$original] = ' ' . islandora_url_to_service_file_media_by_mimetype($data['node'], 'application/pdf'); + break; } } } return $replacements; } + +/** + * Gets Original File PDF file URL. + * + * @param object $node + * A core drupal node object. + * @param string $mime_type + * The name of the node's field to check for the specific relationship. + * + * @return string + * The tokenized value for the given data. + */ +function islandora_url_to_service_file_media_by_mimetype($node, $mime_type) { + $islandora_utils = \Drupal::service('islandora.utils'); + $origfile_term = $islandora_utils->getTermForUri('http://pcdm.org/use#OriginalFile'); + $origfile_media = $islandora_utils->getMediaWithTerm($node, $origfile_term); + // Get the media file's mime_type value. + if (is_object($origfile_media)) { + $origfile_mime_type = ($origfile_media->hasField('field_mime_type')) ? + $origfile_media->get('field_mime_type')->getValue() : NULL; + $origfile_mime_type = (is_array($origfile_mime_type) && + array_key_exists(0, $origfile_mime_type) && + is_array($origfile_mime_type[0]) && + array_key_exists('value', $origfile_mime_type[0])) ? + $origfile_mime_type[0]['value'] : ''; + // Compare the media file's mime_type to the given value. + if ($origfile_mime_type == $mime_type) { + $vid = $origfile_media->id(); + if (!is_null($vid)) { + $media = Media::load($vid); + $bundle = $media->bundle(); + // Since this is Islandora and we assume the Original File is a + // Document type... but doing it dynamically. + $fid = $media->get('field_media_' . $bundle)->getValue(); + $fid_value = (is_array($fid) && array_key_exists(0, $fid) && + array_key_exists('target_id', $fid[0])) ? + $fid[0]['target_id'] : NULL; + if (!is_null($fid_value)) { + $file = File::load($fid_value); + if ($file) { + $url = $islandora_utils->getDownloadUrl($file); + return $url; + } + } + } + } + } +}