diff --git a/src/Tests/TokenFieldUiTest.php b/src/Tests/TokenFieldUiTest.php index 648f01d..ecb5b3a 100644 --- a/src/Tests/TokenFieldUiTest.php +++ b/src/Tests/TokenFieldUiTest.php @@ -5,6 +5,7 @@ namespace Drupal\token\Tests; use Drupal\node\Entity\NodeType; use Drupal\node\Entity\Node; use Drupal\file\Entity\File; +use Drupal\image\Entity\ImageStyle; /** * Tests field ui. @@ -112,11 +113,12 @@ class TokenFieldUiTest extends TokenTestBase { * Test that tokens are correctly provided and replaced for the image fields. */ public function testImageFieldTokens() { - // Generate an image file. + // Generate 2 different test images. file_unmanaged_copy(\Drupal::root() . '/core/misc/druplicon.png', 'public://example1.png'); file_unmanaged_copy(\Drupal::root() . '/core/misc/loading.gif', 'public://example2.gif'); - // Resize the test images so that they will be scaled down later. + // Resize the test images so that they will be scaled down during token + // replacement. $image1 = \Drupal::service('image.factory')->get('public://example1.png'); $image1->resize(500, 500); $image1->save(); @@ -147,20 +149,38 @@ class TokenFieldUiTest extends TokenTestBase { ]); $node->save(); + // Obtain the file size and dimension of the images that will be scaled + // down during token replacement by applying the styles here. + $style = ImageStyle::load('thumbnail'); + $style->createDerivative('public://example1.png', 'public://styles/thumbnail/public/example1-test.png'); + $style->createDerivative('public://example2.gif', 'public://styles/thumbnail/public/example2-test.gif'); + $image_1_thumbnail = \Drupal::service('image.factory')->get('public://styles/thumbnail/public/example1-test.png'); + $image_2_thumbnail = \Drupal::service('image.factory')->get('public://styles/thumbnail/public/example2-test.gif'); + $style = ImageStyle::load('medium'); + $style->createDerivative('public://example1.png', 'public://styles/medium/public/example1-test.png'); + $style->createDerivative('public://example2.gif', 'public://styles/medium/public/example2-test.gif'); + $image_1_medium = \Drupal::service('image.factory')->get('public://styles/medium/public/example1-test.png'); + $image_2_medium = \Drupal::service('image.factory')->get('public://styles/medium/public/example2-test.gif'); + $style = ImageStyle::load('large'); + $style->createDerivative('public://example1.png', 'public://styles/large/public/example1-test.png'); + $style->createDerivative('public://example2.gif', 'public://styles/large/public/example2-test.gif'); + $image_1_large = \Drupal::service('image.factory')->get('public://styles/large/public/example1-test.png'); + $image_2_large = \Drupal::service('image.factory')->get('public://styles/large/public/example2-test.gif'); + $tokens = [ // field_image 'field_image:thumbnail:mimetype' => 'image/png', 'field_image:medium:mimetype' => 'image/png', 'field_image:large:mimetype' => 'image/png', - 'field_image:thumbnail:filesize' => 7134, - 'field_image:medium:filesize' => 26880, - 'field_image:large:filesize' => 74637, - 'field_image:thumbnail:height' => 100, - 'field_image:medium:height' => 220, - 'field_image:large:height' => 480, - 'field_image:thumbnail:width' => 100, - 'field_image:medium:width' => 220, - 'field_image:large:width' => 480, + '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', @@ -168,20 +188,19 @@ class TokenFieldUiTest extends TokenTestBase { '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' => 3832, - 'field_image_2:medium:filesize' => 13745, - 'field_image_2:large:filesize' => 56469, - 'field_image_2:thumbnail:height' => 100, - 'field_image_2:medium:height' => 220, - 'field_image_2:large:height' => 480, - 'field_image_2:thumbnail:width' => 100, - 'field_image_2:medium:width' => 220, - 'field_image_2:large:width' => 480, + '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/tests/src/Kernel/FieldTest.php b/tests/src/Kernel/FieldTest.php index 85797ef..66c2182 100644 --- a/tests/src/Kernel/FieldTest.php +++ b/tests/src/Kernel/FieldTest.php @@ -241,5 +241,4 @@ class FieldTest extends KernelTestBase { // Verify that node entity type doesn't have a uid token. $this->assertNull($tokenService->getTokenInfo('node', 'uid')); } - } diff --git a/token.tokens.inc b/token.tokens.inc index b8f1539..a9520d7 100644 --- a/token.tokens.inc +++ b/token.tokens.inc @@ -435,48 +435,51 @@ function token_tokens($type, array $tokens, array $data = array(), array $option foreach ($tokens as $name => $original) { $parts = explode(':', $name); - $field = $node->get($parts[0]); - if ((count($parts) == 3) && ($field->getFieldDefinition()->getType() == 'image') && \Drupal::moduleHandler()->moduleExists('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[1]); - $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 ($node->hasField($parts[0]) && \Drupal::moduleHandler()->moduleExists('image')) { + $field = $node->get($parts[0]); + $image_styles = image_style_options(FALSE); + if ((count($parts) == 3) && array_key_exists($parts[1], $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[1]); + $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[2]) { - 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; + if ($derivative_exists) { + /** @var \Drupal\Core\Image\Image $image */ + $image = \Drupal::service('image.factory')->get($derivative_uri); + // Generate the replacement token. + switch ($parts[2]) { + 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; } - continue; } // Other tokens.