public function EntityViewBuilder::buildMultiple in Drupal 8
Same name and namespace in other branches
- 9 core/lib/Drupal/Core/Entity/EntityViewBuilder.php \Drupal\Core\Entity\EntityViewBuilder::buildMultiple()
- 10 core/lib/Drupal/Core/Entity/EntityViewBuilder.php \Drupal\Core\Entity\EntityViewBuilder::buildMultiple()
Builds multiple entities' views; augments entity defaults.
This function is assigned as a #pre_render callback in ::viewMultiple().
By delaying the building of an entity until the #pre_render processing in drupal_render(), the processing cost of assembling an entity's renderable array is saved on cache-hit requests.
Parameters
array $build_list: A renderable array containing build information and context for an entity view.
Return value
array The updated renderable array.
See also
\Drupal\Core\Render\RendererInterface::render()
2 calls to EntityViewBuilder::buildMultiple()
- BlockContentViewBuilder::viewMultiple in core/
modules/ block_content/ src/ BlockContentViewBuilder.php - Builds the render array for the provided entities.
- EntityViewBuilder::build in core/
lib/ Drupal/ Core/ Entity/ EntityViewBuilder.php - Builds an entity's view; augments entity defaults.
File
- core/
lib/ Drupal/ Core/ Entity/ EntityViewBuilder.php, line 272
Class
- EntityViewBuilder
- Base class for entity view builders.
Namespace
Drupal\Core\EntityCode
public function buildMultiple(array $build_list) {
// Build the view modes and display objects.
$view_modes = [];
$entity_type_key = "#{$this->entityTypeId}";
$view_hook = "{$this->entityTypeId}_view";
// Find the keys for the ContentEntities in the build; Store entities for
// rendering by view_mode.
$children = Element::children($build_list);
foreach ($children as $key) {
if (isset($build_list[$key][$entity_type_key])) {
$entity = $build_list[$key][$entity_type_key];
if ($entity instanceof FieldableEntityInterface) {
$view_modes[$build_list[$key]['#view_mode']][$key] = $entity;
}
}
}
// Build content for the displays represented by the entities.
foreach ($view_modes as $view_mode => $view_mode_entities) {
$displays = EntityViewDisplay::collectRenderDisplays($view_mode_entities, $view_mode);
$this
->buildComponents($build_list, $view_mode_entities, $displays, $view_mode);
foreach (array_keys($view_mode_entities) as $key) {
// Allow for alterations while building, before rendering.
$entity = $build_list[$key][$entity_type_key];
$display = $displays[$entity
->bundle()];
$this
->moduleHandler()
->invokeAll($view_hook, [
&$build_list[$key],
$entity,
$display,
$view_mode,
]);
$this
->moduleHandler()
->invokeAll('entity_view', [
&$build_list[$key],
$entity,
$display,
$view_mode,
]);
$this
->addContextualLinks($build_list[$key], $entity);
$this
->alterBuild($build_list[$key], $entity, $display, $view_mode);
// Assign the weights configured in the display.
// @todo: Once https://www.drupal.org/node/1875974 provides the missing
// API, only do it for 'extra fields', since other components have
// been taken care of in EntityViewDisplay::buildMultiple().
foreach ($display
->getComponents() as $name => $options) {
if (isset($build_list[$key][$name])) {
$build_list[$key][$name]['#weight'] = $options['weight'];
}
}
// Allow modules to modify the render array.
$this
->moduleHandler()
->alter([
$view_hook,
'entity_view',
], $build_list[$key], $entity, $display);
}
}
return $build_list;
}