diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php index b4a616ae01d7a01a80fe581898991b6d009ebe43..a6b83cf2c47c070c38cf2a05625376b01d4820fd 100644 --- a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php +++ b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php @@ -277,7 +277,7 @@ public function buildMultiple(array $entities) { 'view_mode' => $this->originalMode, 'display' => $this, ); - \Drupal::moduleHandler()->alter('entity_display_build', $build_list[$key], $context); + \Drupal::moduleHandler()->alter('entity_display_build', $build_list[$id], $context); } return $build_list; diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module index 9d9d63c5a8887a7c63fd170e0c461bca7681e896..bc0595fa1330a5facaf41233177e0f5ac2cd70e0 100644 --- a/core/modules/system/tests/modules/entity_test/entity_test.module +++ b/core/modules/system/tests/modules/entity_test/entity_test.module @@ -665,6 +665,17 @@ function entity_test_entity_prepare_view($entity_type, array $entities, array $d } } +/** + * Implements hook_entity_display_build_alter(). + */ +function entity_test_entity_display_build_alter(&$build, $context) { + /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ + $entity = $context['entity']; + if ($entity->getEntityTypeId() == 'entity_test' && $entity->bundle() == 'display_build_alter_bundle') { + $build['entity_display_build_alter']['#markup'] = 'Content added in hook_entity_display_build_alter for entity id ' . $entity->id(); + } +} + /** * Implements hook_entity_access(). */ diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityViewHookTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityViewHookTest.php new file mode 100644 index 0000000000000000000000000000000000000000..630ff68bd76e8f729fbcdc4caf3bcfbc5334ce8a --- /dev/null +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityViewHookTest.php @@ -0,0 +1,61 @@ +<?php + +namespace Drupal\KernelTests\Core\Entity; + +use Drupal\entity_test\Entity\EntityTest; + +/** + * Test view/render hooks for entities. + * + * @todo Add tests for the following hooks. https://www.drupal.org/node/2755353 + * hook_entity_view_display_alter() + * hook_entity_prepare_view() + * hook_ENTITY_TYPE_view() + * hook_entity_view() + * hook_ENTITY_TYPE_view_alter() + * hook_entity_view_alter() + * + * @group Entity + */ +class EntityViewHookTest extends EntityKernelTestBase { + + /** + * Test hook_entity_display_build_alter(). + */ + public function testHookEntityDisplayBuildAlter() { + entity_test_create_bundle('display_build_alter_bundle'); + /** @var \Drupal\Core\Render\RendererInterface $renderer */ + $renderer = $this->container->get('renderer'); + + $entity_ids = []; + // Create some entities to test. + for ($i = 0; $i < 5; $i++) { + $entity = EntityTest::create([ + 'name' => $this->randomMachineName(), + 'type' => 'display_build_alter_bundle', + ]); + $entity->save(); + $entity_ids[] = $entity->id(); + } + + /** @var \Drupal\entity_test\EntityTestViewBuilder $view_builder */ + $view_builder = $this->container->get('entity_type.manager')->getViewBuilder('entity_test'); + + /** @var \Drupal\Core\Entity\EntityStorageInterface $storage */ + $storage = $this->container->get('entity_type.manager')->getStorage('entity_test'); + $storage->resetCache(); + $entities = $storage->loadMultiple($entity_ids); + + $build = $view_builder->viewMultiple($entities); + + $output = $renderer->renderRoot($build); + $this->setRawContent($output->__toString()); + // Confirm that the content added in + // entity_test_entity_display_build_alter() appears multiple times, not + // just for the final entity. + foreach ($entity_ids as $id) { + $this->assertText('Content added in hook_entity_display_build_alter for entity id ' . $id); + } + } + +}