function LayoutBuilderHooks::entityViewAlter

Implements hook_entity_view_alter().

ExtraFieldBlock block plugins add placeholders for each extra field which is configured to be displayed. Those placeholders are replaced by this hook. Modules that implement hook_entity_extra_field_info() use their implementations of hook_entity_view_alter() to add the rendered output of the extra fields they provide, so we cannot get the rendered output of extra fields before this point in the view process. layout_builder_module_implements_alter() moves this implementation of hook_entity_view_alter() to the end of the list.

Attributes

#[Hook('entity_view_alter', order: Order::Last)]

See also

\Drupal\layout_builder\Plugin\Block\ExtraFieldBlock::build()

layout_builder_module_implements_alter()

File

core/modules/layout_builder/src/Hook/LayoutBuilderHooks.php, line 155

Class

LayoutBuilderHooks
Hook implementations for layout_builder.

Namespace

Drupal\layout_builder\Hook

Code

public function entityViewAlter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) : void {
  // Only replace extra fields when Layout Builder has been used to alter the
  // build. See \Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay::buildMultiple().
  if (isset($build['_layout_builder']) && !Element::isEmpty($build['_layout_builder'])) {
    /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */
    $field_manager = \Drupal::service('entity_field.manager');
    $extra_fields = $field_manager->getExtraFields($entity->getEntityTypeId(), $entity->bundle());
    if (!empty($extra_fields['display'])) {
      foreach ($extra_fields['display'] as $field_name => $extra_field) {
        // If the extra field is not set replace with an empty array to avoid
        // the placeholder text from being rendered.
        $replacement = $build[$field_name] ?? [];
        ExtraFieldBlock::replaceFieldPlaceholder($build, $replacement, $field_name);
        // After the rendered field in $build has been copied over to the
        // ExtraFieldBlock block we must remove it from its original location
        // or else it will be rendered twice.
        unset($build[$field_name]);
      }
    }
  }
  $route_name = \Drupal::routeMatch()->getRouteName();
  // If the entity is displayed within a Layout Builder block and the current
  // route is in the Layout Builder UI, then remove all contextual link
  // placeholders.
  if ($route_name && $display instanceof LayoutBuilderEntityViewDisplay && str_starts_with($route_name, 'layout_builder.')) {
    unset($build['#contextual_links']);
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.