diff --git a/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php b/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php index 388fdff..6b40ccd 100644 --- a/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php +++ b/core/modules/responsive_image/src/Entity/ResponsiveImageStyle.php @@ -186,21 +186,9 @@ public function calculateDependencies() { $this->addDependency($type, $provider); } // Extract all the styles from the image style mappings. - $styles = []; - foreach ($this->getImageStyleMappings() as $mapping) { - if ($mapping['image_mapping_type'] == 'sizes') { - $styles = array_merge($styles, $mapping['image_mapping']['sizes_image_styles']); - } - else { - $styles[] = $mapping['image_mapping']; - } - } - $styles = array_unique($styles); + $styles = ImageStyle::loadMultiple($this->getImageStyleIds()); array_walk($styles, function ($style) { - $style = ImageStyle::load($style); - if ($style) { - $this->addDependency('config', $style->getConfigDependencyName()); - } + $this->addDependency('config', $style->getConfigDependencyName()); }); return $this->dependencies; } @@ -239,4 +227,25 @@ public function getImageStyleMapping($breakpoint_id, $multiplier) { } } + /** + * {@inheritdoc} + */ + public function getImageStyleIds() { + $image_styles = []; + foreach ($this->getImageStyleMappings() as $image_style_mapping) { + // Only image styles of non-empty mappings should be loaded. + if (!$this::isEmptyImageStyleMapping($image_style_mapping)) { + switch($image_style_mapping['image_mapping_type']) { + case 'image_style': + $image_styles[] = $image_style_mapping['image_mapping']; + break; + case 'sizes': + $image_styles = array_merge($image_styles, $image_style_mapping['image_mapping']['sizes_image_styles']); + break; + } + } + } + return array_values(array_filter(array_unique($image_styles))); + } + } diff --git a/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php b/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php index 0cf8d8a..3ef5a5d 100644 --- a/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php +++ b/core/modules/responsive_image/src/Plugin/Field/FieldFormatter/ResponsiveImageFormatter.php @@ -198,21 +198,7 @@ public function viewElements(FieldItemListInterface $items) { $cache_tags = []; if ($responsive_image_style) { $cache_tags = Cache::mergeTags($cache_tags, $responsive_image_style->getCacheTags()); - foreach ($responsive_image_style->getImageStyleMappings() as $image_style_mapping) { - // Only image styles of non-empty mappings should be loaded. - if (!$responsive_image_style::isEmptyImageStyleMapping($image_style_mapping)) { - - if ($image_style_mapping['image_mapping_type'] == 'image_style') { - // This mapping has one image style, add it. - $image_styles_to_load[] = $image_style_mapping['image_mapping']; - } - else { - // This mapping has multiple image styles, merge them. - $image_style_mapping['image_mapping']['sizes_image_styles'] = array_filter($image_style_mapping['image_mapping']['sizes_image_styles']); - $image_styles_to_load = array_merge($image_styles_to_load, $image_style_mapping['image_mapping']['sizes_image_styles']); - } - } - } + $image_styles_to_load = $responsive_image_style->getImageStyleIds(); } // If there is a fallback image style, add it to the image styles to load. diff --git a/core/modules/responsive_image/src/ResponsiveImageStyleInterface.php b/core/modules/responsive_image/src/ResponsiveImageStyleInterface.php index feb3639..09c9259 100644 --- a/core/modules/responsive_image/src/ResponsiveImageStyleInterface.php +++ b/core/modules/responsive_image/src/ResponsiveImageStyleInterface.php @@ -126,4 +126,11 @@ public function addImageStyleMapping($breakpoint_id, $multiplier, array $image_s */ public function removeImageStyleMappings(); + /** + * Gets all the image styles IDs involved in the responsive image mapping. + * + * @return array + */ + public function getImageStyleIds(); + } diff --git a/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php b/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php index 36a2577..8c3ade6 100644 --- a/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php +++ b/core/modules/responsive_image/tests/src/Unit/ResponsiveImageStyleConfigEntityUnitTest.php @@ -66,19 +66,19 @@ protected function setUp() { */ public function testCalculateDependencies() { // Set up image style loading mock. - $image_style_small = $this->getMock('Drupal\Core\Config\Entity\ConfigEntityInterface'); - $map = [['broken_stype', NULL]]; + $styles = []; foreach (['small', 'medium', 'large'] as $style) { $mock = $this->getMock('Drupal\Core\Config\Entity\ConfigEntityInterface'); $mock->expects($this->any()) ->method('getConfigDependencyName') ->willReturn('image.style.' . $style); - $map[] = [$style, $mock]; + $styles[$style] = $mock; } $storage = $this->getMock('\Drupal\Core\Config\Entity\ConfigEntityStorageInterface'); $storage->expects($this->any()) - ->method('load') - ->willReturnMap($map); + ->method('loadMultiple') + ->with(array_keys($styles)) + ->willReturn($styles); $this->entityManager->expects($this->any()) ->method('getStorage') ->with('image_style') @@ -91,7 +91,6 @@ public function testCalculateDependencies() { $entity = new ResponsiveImageStyle(['breakpoint_group' => 'test_group']); $entity->setBreakpointGroup('test_group'); $entity->addImageStyleMapping('test_breakpoint', '1x', ['image_mapping_type' => 'image_style', 'image_mapping' => 'small']); - $entity->addImageStyleMapping('test_breakpoint', '2x', ['image_mapping_type' => 'image_style', 'image_mapping' => 'broken_style']); $entity->addImageStyleMapping('test_breakpoint', '2x', [ 'image_mapping_type' => 'sizes', 'image_mapping' => [