diff --git a/src/Tests/TokenFieldUiTest.php b/src/Tests/TokenFieldUiTest.php index 37c80f4..648f01d 100644 --- a/src/Tests/TokenFieldUiTest.php +++ b/src/Tests/TokenFieldUiTest.php @@ -3,6 +3,8 @@ namespace Drupal\token\Tests; use Drupal\node\Entity\NodeType; +use Drupal\node\Entity\Node; +use Drupal\file\Entity\File; /** * Tests field ui. @@ -60,6 +62,17 @@ class TokenFieldUiTest extends TokenTestBase { 'entity_type' => 'node', 'bundle' => 'article', ))->save(); + entity_create('field_storage_config', array( + 'field_name' => 'field_image_2', + 'entity_type' => 'node', + 'type' => 'image', + ))->save(); + entity_create('field_config', array( + 'field_name' => 'field_image_2', + 'label' => 'Image 2', + 'entity_type' => 'node', + 'bundle' => 'article', + ))->save(); entity_get_form_display('node', 'article', 'default') ->setComponent('field_body', [ @@ -94,4 +107,81 @@ class TokenFieldUiTest extends TokenTestBase { $this->drupalGet('node/add/article'); $this->assertText('The site is called Drupal.'); } + + /** + * Test that tokens are correctly provided and replaced for the image fields. + */ + public function testImageFieldTokens() { + // Generate an image file. + 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. + $image1 = \Drupal::service('image.factory')->get('public://example1.png'); + $image1->resize(500, 500); + $image1->save(); + $image2 = \Drupal::service('image.factory')->get('public://example2.gif'); + $image2->resize(500, 500); + $image2->save(); + + /** @var \Drupal\file\Entity\File $image1 */ + $image1 = File::create(['uri' => 'public://example1.png']); + $image1->save(); + /** @var \Drupal\file\Entity\File $image2 */ + $image2 = File::create(['uri' => 'public://example2.gif']); + $image2->save(); + + $node = Node::create([ + 'title' => 'Test node title', + 'type' => 'article', + 'field_image' => [ + [ + 'target_id' => $image1->id(), + ], + ], + 'field_image_2' => [ + [ + 'target_id' => $image2->id(), + ], + ], + ]); + $node->save(); + + $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: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: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: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 66c2182..85797ef 100644 --- a/tests/src/Kernel/FieldTest.php +++ b/tests/src/Kernel/FieldTest.php @@ -241,4 +241,5 @@ 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 1496954..b8f1539 100644 --- a/token.tokens.inc +++ b/token.tokens.inc @@ -434,35 +434,43 @@ function token_tokens($type, array $tokens, array $data = array(), array $option $node = $data['node']; foreach ($tokens as $name => $original) { - // Field image tokens. Integration of Drupal 7's Imagecache Token module. $parts = explode(':', $name); - if ((count($parts) === 3) && $parts[0] === 'field_image') { - // Token is of the form field_image:{image_style}:type. An image - // derivative of the original has to be created first. + $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 = $node->field_image->entity; + $field_image = $field->entity; $original_uri = $field_image->getFileUri(); $style = ImageStyle::load($parts[1]); $derivative_uri = $style->buildUri($original_uri); - if ($style->createDerivative($original_uri, $derivative_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; + break; case 'filesize' : $replacements[$original] = $image->getFileSize(); - break; + break; case 'height' : $replacements[$original] = $image->getHeight(); - break; + break; case 'width' : $replacements[$original] = $image->getWidth(); - break; + break; case 'uri' : $replacements[$original] = $derivative_uri; break; @@ -1267,50 +1275,53 @@ function field_token_info_alter(&$info) { 'description' => $description, 'module' => 'token', ); + + // Provide additional tokens for the image fields of nodes. + // Integration of Drupal 7's Imagecache Token module. + if (($entity_type_id == 'node') && ($field->getType() == 'image') && \Drupal::moduleHandler()->moduleExists('image')) { + $info['tokens']['node'][$field_name]['type'] = 'field_image'; + } } } - // Provide additional tokens for image_style. Integration of Drupal 7's - // Imagecache Token module. - $info['tokens']['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'] = [ - 'name' => t('File size'), - 'description' => t('The file size of the image.'), - ]; - $info['tokens']['image_style']['height'] = [ - 'name' => t('Height'), - 'description' => t('The height the image, in pixels.'), - ]; - $info['tokens']['image_style']['width'] = [ - 'name' => t('Width'), - 'description' => t('The width of the image, in pixels.'), - ]; - $info['tokens']['image_style']['uri'] = [ - 'name' => t('URI'), - 'description' => t('The URI to the image.'), - ]; - // Provide image_field tokens for the different image styles. - $info['types']['field_image'] = [ - 'name' => t('Image field'), - 'needs-data' => 'field_image', - 'module' => 'token', - ]; - - $image_styles = image_style_options(FALSE); - foreach ($image_styles as $style => $description) { - $info['tokens']['field_image'][$style] = [ - 'name' => $style, - 'description' => t('@description image.', ['@description' => $description]), - 'type' => 'image_style', + if (\Drupal::moduleHandler()->moduleExists('image')) { + $info['types']['field_image'] = [ + 'name' => t('Image field'), + 'needs-data' => 'field_image', + 'module' => 'token', ]; - } - // Change the existing field_image token type to put everything together. - $info['tokens']['node']['field_image']['type'] = 'field_image'; + $image_styles = image_style_options(FALSE); + foreach ($image_styles as $style => $description) { + $info['tokens']['field_image'][$style] = [ + 'name' => $style, + 'description' => t('@description image.', ['@description' => $description]), + 'type' => 'image_style', + ]; + } + + $info['tokens']['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'] = [ + 'name' => t('File size'), + 'description' => t('The file size of the image.'), + ]; + $info['tokens']['image_style']['height'] = [ + 'name' => t('Height'), + 'description' => t('The height the image, in pixels.'), + ]; + $info['tokens']['image_style']['width'] = [ + 'name' => t('Width'), + 'description' => t('The width of the image, in pixels.'), + ]; + $info['tokens']['image_style']['uri'] = [ + 'name' => t('URI'), + 'description' => t('The URI to the image.'), + ]; + } } /**