From 41663bdb3dbb81474f54fa0e756934c1f0109257 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Mon, 25 Jul 2016 10:16:37 +0100
Subject: [PATCH] Issue #2754783 by danmuzyka, jhedstrom, alexpott:
 hook_entity_display_build_alter() only affects final entity in $build_list
 array

(cherry picked from commit 7c0a466ba66121489c7cf7889e3c7453327d2ed8)
---
 .../Core/Entity/Entity/EntityViewDisplay.php  |  2 +-
 .../modules/entity_test/entity_test.module    | 11 ++++
 .../Core/Entity/EntityViewHookTest.php        | 61 +++++++++++++++++++
 3 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 core/tests/Drupal/KernelTests/Core/Entity/EntityViewHookTest.php

diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
index b4a616ae01d7..a6b83cf2c47c 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 9d9d63c5a888..bc0595fa1330 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 000000000000..630ff68bd76e
--- /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);
+    }
+  }
+
+}
-- 
GitLab