diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php index 7550ad4..26fee12 100644 --- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php +++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php @@ -137,18 +137,13 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang */ protected function getBuildDefaults(EntityInterface $entity, $view_mode, $langcode) { $that = $this; - // Create a closure that uses the current execution context object as its - // invocation object. - $callback = function ($elements) use ($that) { - return $that->entityViewBuilderPreRender($elements); - }; $build = array( '#theme' => $this->entityType, "#{$this->entityType}" => $entity, '#view_mode' => $view_mode, '#langcode' => $langcode, - '#pre_render' => array($callback), + '#pre_render' => array(array($this, 'entityViewBuilderPreRender')), ); // Cache the rendered output if permitted by the view mode and global entity @@ -185,21 +180,28 @@ public function entityViewBuilderPreRender(array $elements) { $entity = $elements['#entity']; $bundle = $entity->bundle(); $view_hook = "{$this->entityType}_view"; - $display = $elements['#display']; $view_mode = $elements['#view_mode']; $langcode = $elements['#langcode']; + $context = array('langcode' => $langcode); - $entity->content['#view_mode'] = $view_mode; - \Drupal::moduleHandler()->invokeAll($view_hook, array($entity, $display, $view_mode, $langcode)); - \Drupal::moduleHandler()->invokeAll('entity_view', array($entity, $display, $view_mode, $langcode)); + // Allow modules to change the view mode. + drupal_alter('entity_view_mode', $view_mode, $entity, $context); + + // Get the corresponding display settings. + $display = entity_get_render_display($entity, $view_mode); // Build field renderables. + $entity->content = $elements; $this->buildContent(array($entity), array($bundle => $display), $view_mode, $langcode); + $view_mode = isset($entity->content['#view_mode']) ? $entity->content['#view_mode'] : $view_mode; + + \Drupal::moduleHandler()->invokeAll($view_hook, array($entity, $display, $view_mode, $langcode)); + \Drupal::moduleHandler()->invokeAll('entity_view', array($entity, $display, $view_mode, $langcode)); // Do not override $build = $elements because hook_view implementations // are expected to add content, not alter it. For example, mymodule_view // should not change the #theme key. - $build += $entity->content; + $build = $entity->content; // We don't need duplicate rendering info in $entity->content. unset($entity->content); @@ -252,9 +254,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la } // Build the view modes and display objects. - $context = array('langcode' => $langcode); $build = array('#sorted' => TRUE); - $view_hook = "{$this->entityType}_view"; $weight = 0; foreach ($entities as $key => $entity) { @@ -264,23 +264,13 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la $entity = $this->entityManager->getTranslationFromContext($entity, $langcode); $entities[$key] = $entity; - // Allow modules to change the view mode. - $entity_view_mode = $view_mode; - drupal_alter('entity_view_mode', $entity_view_mode, $entity, $context); - - // Get the corresponding display settings. - $display = entity_get_render_display($entity, $entity_view_mode); - //$build[$key] = $entity->content; $build[$key] = array( - '#entity' => $entity, - '#view_mode' => $entity_view_mode, - '#display' => $display, - '#langcode' => $langcode, + '#entity' => $entity ); // Set defaults for #pre_render. - $build[$key] += $this->getBuildDefaults($entity, $entity_view_mode, $langcode); + $build[$key] += $this->getBuildDefaults($entity, $view_mode, $langcode); $build[$key]['#weight'] = $weight++; }