.../Entity/Controller/EntityViewController.php | 36 ++++++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php b/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php index c0e5b7a..e1dbcd7 100644 --- a/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php +++ b/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php @@ -64,6 +64,29 @@ public static function create(ContainerInterface $container) { ); } + + /** + * Pre-render callback to execute pre-render callbacks of the 'entity' child. + * + * Necessary for ::buildTitle() to work. + * + * @param array $page + * A page render array. + * + * @return array + * The changed page render array. + */ + public function preRenderEntityChild(array $page) { + $this->controllerResolver = \Drupal::service('controller_resolver'); + foreach ($page['entity']['#pre_render'] as $callable) { + if (is_string($callable) && strpos($callable, '::') === FALSE) { + $callable = $this->controllerResolver->getControllerFromDefinition($callable); + } + $page['entity'] = call_user_func($callable, $page['entity']); + } + return $page; + } + /** * Pre-render callback to build the page title. * @@ -84,16 +107,8 @@ public function buildTitle(array $page) { // correctly (e.g. RDFa, in-place editing). if ($entity instanceof FieldableEntityInterface) { $label_field = $entity->getEntityType()->getKey('label'); - $view_mode = isset($entity_output['#view_mode']) ? $entity_output['#view_mode'] : 'full'; - $displays = EntityViewDisplay::collectRenderDisplays([$entity], $view_mode); - /** @var \Drupal\Core\Entity\Entity\EntityViewDisplay $display */ - $display = array_values($displays)[0]; - if ($component = $display->getComponent($label_field)) { - $field_build = $this->entityManager - ->getViewBuilder($entity->getEntityTypeId()) - ->viewField($entity->{$label_field}, $component); - $field_build['#view_mode'] = $view_mode; - $page['#title'] = $this->renderer->render($field_build); + if (isset($page['entity'][$label_field])) { + $page['#title'] = $this->renderer->render($page['entity'][$label_field]); } } return $page; @@ -118,6 +133,7 @@ public function view(EntityInterface $_entity, $view_mode = 'full') { ->getViewBuilder($_entity->getEntityTypeId()) ->view($_entity, $view_mode); + $page['#pre_render'][] = [$this, 'preRenderEntityChild']; $page['#pre_render'][] = [$this, 'buildTitle']; $page['entity']['#entity_type'] = $_entity->getEntityTypeId(); $page['entity']['#' . $page['entity']['#entity_type']] = $_entity;