diff --git a/src/Tests/TokenFieldUiTest.php b/src/Tests/TokenFieldUiTest.php index d2273bc..76aed4e 100644 --- a/src/Tests/TokenFieldUiTest.php +++ b/src/Tests/TokenFieldUiTest.php @@ -169,38 +169,39 @@ class TokenFieldUiTest extends TokenTestBase { $tokens = [ // field_image - 'field_image:image_styles:thumbnail:mimetype' => 'image/png', - 'field_image:image_styles:medium:mimetype' => 'image/png', - 'field_image:image_styles:large:mimetype' => 'image/png', - 'field_image:image_styles:thumbnail:filesize' => $image_1_thumbnail->getFileSize(), - 'field_image:image_styles:medium:filesize' => $image_1_medium->getFileSize(), - 'field_image:image_styles:large:filesize' => $image_1_large->getFileSize(), - 'field_image:image_styles:thumbnail:height' => $image_1_thumbnail->getHeight(), - 'field_image:image_styles:medium:height' => $image_1_medium->getHeight(), - 'field_image:image_styles:large:height' => $image_1_large->getHeight(), - 'field_image:image_styles:thumbnail:width' => $image_1_thumbnail->getWidth(), - 'field_image:image_styles:medium:width' => $image_1_medium->getWidth(), - 'field_image:image_styles:large:width' => $image_1_large->getWidth(), - 'field_image:image_styles:thumbnail:uri' => 'public://styles/thumbnail/public/example1.png', - 'field_image:image_styles:medium:uri' => 'public://styles/medium/public/example1.png', - 'field_image:image_styles:large:uri' => 'public://styles/large/public/example1.png', + 'field_image:thumbnail:mimetype' => 'image/png', + 'field_image:medium:mimetype' => 'image/png', + 'field_image:large:mimetype' => 'image/png', + 'field_image:thumbnail:filesize' => $image_1_thumbnail->getFileSize(), + 'field_image:medium:filesize' => $image_1_medium->getFileSize(), + 'field_image:large:filesize' => $image_1_large->getFileSize(), + 'field_image:thumbnail:height' => $image_1_thumbnail->getHeight(), + 'field_image:medium:height' => $image_1_medium->getHeight(), + 'field_image:large:height' => $image_1_large->getHeight(), + 'field_image:thumbnail:width' => $image_1_thumbnail->getWidth(), + 'field_image:medium:width' => $image_1_medium->getWidth(), + 'field_image:large:width' => $image_1_large->getWidth(), + 'field_image:thumbnail:uri' => 'public://styles/thumbnail/public/example1.png', + 'field_image:medium:uri' => 'public://styles/medium/public/example1.png', + 'field_image:large:uri' => 'public://styles/large/public/example1.png', // field_image_2 - 'field_image_2:image_styles:thumbnail:mimetype' => 'image/gif', - 'field_image_2:image_styles:medium:mimetype' => 'image/gif', - 'field_image_2:image_styles:large:mimetype' => 'image/gif', - 'field_image_2:image_styles:thumbnail:filesize' => $image_2_thumbnail->getFileSize(), - 'field_image_2:image_styles:medium:filesize' => $image_2_medium->getFileSize(), - 'field_image_2:image_styles:large:filesize' => $image_2_large->getFileSize(), - 'field_image_2:image_styles:thumbnail:height' => $image_2_thumbnail->getHeight(), - 'field_image_2:image_styles:medium:height' => $image_2_medium->getHeight(), - 'field_image_2:image_styles:large:height' => $image_2_large->getHeight(), - 'field_image_2:image_styles:thumbnail:width' => $image_2_thumbnail->getWidth(), - 'field_image_2:image_styles:medium:width' => $image_2_medium->getWidth(), - 'field_image_2:image_styles:large:width' => $image_2_large->getWidth(), - 'field_image_2:image_styles:thumbnail:uri' => 'public://styles/thumbnail/public/example2.gif', - 'field_image_2:image_styles:medium:uri' => 'public://styles/medium/public/example2.gif', - 'field_image_2:image_styles:large:uri' => 'public://styles/large/public/example2.gif', + 'field_image_2:thumbnail:mimetype' => 'image/gif', + 'field_image_2:medium:mimetype' => 'image/gif', + 'field_image_2:large:mimetype' => 'image/gif', + 'field_image_2:thumbnail:filesize' => $image_2_thumbnail->getFileSize(), + 'field_image_2:medium:filesize' => $image_2_medium->getFileSize(), + 'field_image_2:large:filesize' => $image_2_large->getFileSize(), + 'field_image_2:thumbnail:height' => $image_2_thumbnail->getHeight(), + 'field_image_2:medium:height' => $image_2_medium->getHeight(), + 'field_image_2:large:height' => $image_2_large->getHeight(), + 'field_image_2:thumbnail:width' => $image_2_thumbnail->getWidth(), + 'field_image_2:medium:width' => $image_2_medium->getWidth(), + 'field_image_2:large:width' => $image_2_large->getWidth(), + 'field_image_2:thumbnail:uri' => 'public://styles/thumbnail/public/example2.gif', + 'field_image_2:medium:uri' => 'public://styles/medium/public/example2.gif', + 'field_image_2:large:uri' => 'public://styles/large/public/example2.gif', ]; $this->assertTokens('node', ['node' => $node], $tokens); } + } diff --git a/token.tokens.inc b/token.tokens.inc index ac581e6..faaa745 100644 --- a/token.tokens.inc +++ b/token.tokens.inc @@ -384,55 +384,33 @@ function token_token_info() { 'dynamic' => TRUE, ); - // Provide image_field tokens for the different image styles. + // Define image_with_image_style token type. if (\Drupal::moduleHandler()->moduleExists('image')) { - $info['types']['image_field'] = [ - 'name' => t('Image field'), - 'needs-data' => 'image_field', + $info['types']['image_with_image_style'] = [ + 'name' => t('Image with image style'), + 'needs-data' => 'image_with_image_style', 'module' => 'token', 'nested' => TRUE, ]; - $info['tokens']['image_field']['image_styles'] = [ - 'name' => t('Image styles'), - 'description' => t('The image styles.'), - 'type' => 'image_styles', - ]; - - $info['types']['image_styles'] = [ - 'name' => t('Image styles'), - 'needs-data' => 'image_styles', - 'module' => 'token', - 'nested' => TRUE, - ]; - - $image_styles = image_style_options(FALSE); - foreach ($image_styles as $style => $description) { - $info['tokens']['image_styles'][$style] = [ - 'name' => $style, - 'description' => t('@description image.', ['@description' => $description]), - 'type' => 'image_style', - ]; - } - - // Provide additional image_style tokens. - $info['tokens']['image_style']['mimetype'] = [ + // Provide tokens for the ImageStyle attributes. + $info['tokens']['image_with_image_style']['mimetype'] = [ 'name' => t('MIME type'), 'description' => t('The MIME type (image/png, image/bmp, etc.) of the image.'), ]; - $info['tokens']['image_style']['filesize'] = [ + $info['tokens']['image_with_image_style']['filesize'] = [ 'name' => t('File size'), 'description' => t('The file size of the image.'), ]; - $info['tokens']['image_style']['height'] = [ + $info['tokens']['image_with_image_style']['height'] = [ 'name' => t('Height'), 'description' => t('The height the image, in pixels.'), ]; - $info['tokens']['image_style']['width'] = [ + $info['tokens']['image_with_image_style']['width'] = [ 'name' => t('Width'), 'description' => t('The width of the image, in pixels.'), ]; - $info['tokens']['image_style']['uri'] = [ + $info['tokens']['image_with_image_style']['uri'] = [ 'name' => t('URI'), 'description' => t('The URI to the image.'), ]; @@ -493,55 +471,6 @@ function token_tokens($type, array $tokens, array $data = array(), array $option $node = $data['node']; foreach ($tokens as $name => $original) { - $parts = explode(':', $name); - if ($node->hasField($parts[0]) && \Drupal::moduleHandler()->moduleExists('image')) { - $field = $node->get($parts[0]); - $image_styles = image_style_options(FALSE); - if ((count($parts) == 4) && array_key_exists($parts[2], $image_styles) && ($field->getFieldDefinition()->getType() == 'image')) { - // Token is of the form {field_name}:{image_style}:{token}. An image - // derivative of the original has to be created first. Integration of - // Drupal 7's Imagecache Token module. - /** @var \Drupal\file\Entity\File $field_image */ - $field_image = $field->entity; - $original_uri = $field_image->getFileUri(); - $style = ImageStyle::load($parts[2]); - $derivative_uri = $style->buildUri($original_uri); - - if (!file_exists($derivative_uri)) { - // If the image derivative already exists, no need to re-generate it. - $derivative_exists = $style->createDerivative($original_uri, $derivative_uri); - } - else { - $derivative_exists = TRUE; - } - - if ($derivative_exists) { - /** @var \Drupal\Core\Image\Image $image */ - $image = \Drupal::service('image.factory')->get($derivative_uri); - // Generate the replacement token. - switch ($parts[3]) { - case 'mimetype': - $replacements[$original] = $image->getMimeType(); - break; - case 'filesize' : - $replacements[$original] = $image->getFileSize(); - break; - case 'height' : - $replacements[$original] = $image->getHeight(); - break; - case 'width' : - $replacements[$original] = $image->getWidth(); - break; - case 'uri' : - $replacements[$original] = $derivative_uri; - break; - } - } - continue; - } - } - - // Other tokens. switch ($name) { case 'log': $replacements[$original] = (string) $node->revision_log->value; @@ -1350,14 +1279,6 @@ function field_token_info_alter(&$info) { 'needs-data' => $field_token_name, 'nested' => TRUE, ]; - - // For fields of type image, the field's type is changed and field - // properties are not added. - if (($field->getType() == 'image') && \Drupal::moduleHandler()->moduleExists('image')) { - $info['tokens'][$token_type][$field_name]['type'] = 'image_field'; - continue; - } - // Field list token type. if ($cardinality > 1) { $info['types']["list<$field_token_name>"] = array( @@ -1389,6 +1310,18 @@ function field_token_info_alter(&$info) { ]; } } + + // Provide image_with_image_style tokens for image fields. + if (($field->getType() == 'image') && \Drupal::moduleHandler()->moduleExists('image')) { + $image_styles = image_style_options(FALSE); + foreach ($image_styles as $style => $description) { + $info['tokens'][$field_token_name][$style] = [ + 'name' => $style, + 'description' => t('@description image.', ['@description' => $description]), + 'type' => 'image_with_image_style', + ]; + } + } } } } @@ -1534,6 +1467,54 @@ function field_tokens($type, $tokens, array $data = array(), array $options = ar if (isset($data[$data['field_name']][$delta]) && isset($data[$data['field_name']][$delta]->$name)) { $replacements[$original] = $data[$data['field_name']][$delta]->$name; } + + // Handle [field_name:image_style:token] tokens. + if (\Drupal::moduleHandler()->moduleExists('image')) { + $field = $data[$data['field_name']]; + $parts = explode(':', $name); + $image_styles = image_style_options(FALSE); + + if ((count($parts) == 2) && array_key_exists($parts[0], $image_styles) && ($field->getFieldDefinition()->getType() == 'image')) { + // An image derivative of the original has to be created first. + /** @var \Drupal\file\Entity\File $field_image */ + $field_image = $field->entity; + $original_uri = $field_image->getFileUri(); + $style = ImageStyle::load($parts[0]); + $derivative_uri = $style->buildUri($original_uri); + + if (!file_exists($derivative_uri)) { + // If the image derivative already exists, don't re-generate it. + $derivative_exists = $style->createDerivative($original_uri, $derivative_uri); + } + else { + $derivative_exists = TRUE; + } + + if ($derivative_exists) { + /** @var \Drupal\Core\Image\Image $image */ + $image = \Drupal::service('image.factory')->get($derivative_uri); + // Generate the replacement token. + switch ($parts[1]) { + case 'mimetype': + $replacements[$original] = $image->getMimeType(); + break; + case 'filesize' : + $replacements[$original] = $image->getFileSize(); + break; + case 'height' : + $replacements[$original] = $image->getHeight(); + break; + case 'width' : + $replacements[$original] = $image->getWidth(); + break; + case 'uri' : + $replacements[$original] = $derivative_uri; + break; + } + } + continue; + } + } } } return $replacements;