acquia_dam-1.0.0-rc1/acquia_dam.tokens.inc
acquia_dam.tokens.inc
<?php
/**
* @file
* Builds placeholder replacement tokens for DAM media.
*/
declare(strict_types=1);
use Drupal\acquia_dam\Plugin\media\Source\Asset;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\media\MediaInterface;
/**
* Implements hook_token_info_alter().
*/
function acquia_dam_token_info_alter(&$data) {
$module_handler = \Drupal::moduleHandler();
// If the Token module is not installed, we need the `media` token type
// to exist for our tokens to work. The Token module provides token types for
// all entities, Drupal core does not.
if (!$module_handler->moduleExists('token')) {
$entity_info = \Drupal::entityTypeManager()->getDefinition('media');
assert($entity_info !== NULL);
$data['types'][$entity_info->id()] = [
'name' => $entity_info->getLabel(),
'needs-data' => $entity_info->id(),
'module' => 'media',
];
}
}
/**
* Implements hook_token_info().
*/
function acquia_dam_token_info() {
$info = [];
$info['tokens']['media']['embed-code'] = [
'name' => 'Embed codes',
'description' => 'Embed codes for the DAM asset',
'module' => 'acquia_dam',
'type' => 'media-embed-code',
];
$info['types']['media-embed-code'] = [
'name' => 'embed-code',
'needs-data' => 'media-embed-code',
'nested' => TRUE,
];
$info['tokens']['media-embed-code']['url'] = [
'name' => 'URL',
'module' => 'acquia_dam',
];
$info['tokens']['media']['asset-path'] = [
'name' => 'Asset Path',
'description' => 'Path of the asset',
];
return $info;
}
/**
* Implements hook_tokens().
*/
function acquia_dam_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
$replacements = [];
// Support Token module or our replacement type if Token is not installed.
if ($type === 'media' && isset($data['media'])) {
$media = $data['media'];
}
elseif ($type === 'entity' && isset($data['entity'])) {
$media = $data['entity'];
}
else {
return $replacements;
}
if (!$media instanceof MediaInterface) {
return $replacements;
}
$source = $media->getSource();
if (!$source instanceof Asset) {
return $replacements;
}
foreach ($tokens as $name => $original) {
if ($name == 'asset-path') {
[$asset_id, $version_id] = array_values($media->get('acquia_dam_asset_id')->getValue()[0]);
$replacements[$original] = "acquia-dam://$asset_id/$version_id";
continue;
}
if (strpos($name, ':') === FALSE) {
// All of our tokens are nested.
continue;
}
[$token_name, $property] = explode(':', $name, 2);
if ($token_name === 'embed-code') {
/** @var array<string, array<string, string>> $embeds */
$embeds = $source->getMetadata($media, 'embeds');
if ($property === 'url') {
$replacements[$original] = $embeds['original']['url'];
}
}
}
return $replacements;
}
