public function EntityRenderController::viewMultiple

Implements \Drupal\Core\Entity\EntityRenderControllerInterface::viewMultiple().

Overrides EntityRenderControllerInterface::viewMultiple

1 call to EntityRenderController::viewMultiple()
1 method overrides EntityRenderController::viewMultiple()

File

drupal/core/lib/Drupal/Core/Entity/EntityRenderController.php, line 97
Contains \Drupal\Core\Entity\EntityRenderController.

Class

EntityRenderController
Base class for entity view controllers.

Namespace

Drupal\Core\Entity

Code

public function viewMultiple(array $entities = array(), $view_mode = 'full', $langcode = NULL) {
  if (!isset($langcode)) {
    $langcode = language(Language::TYPE_CONTENT)->langcode;
  }

  // Build the view modes and display objects.
  $view_modes = array();
  $displays = array();
  $context = array(
    'langcode' => $langcode,
  );
  foreach ($entities as $entity) {
    $bundle = $entity
      ->bundle();

    // Allow modules to change the view mode.
    $entity_view_mode = $view_mode;
    drupal_alter('entity_view_mode', $entity_view_mode, $entity, $context);

    // Store entities for rendering by view_mode.
    $view_modes[$entity_view_mode][$entity
      ->id()] = $entity;

    // Load the corresponding display settings if not stored yet.
    if (!isset($displays[$entity_view_mode][$bundle])) {

      // Get the display object for this bundle and view mode.
      $display = entity_get_render_display($entity, $entity_view_mode);

      // Let modules alter the display.
      $display_context = array(
        'entity_type' => $this->entityType,
        'bundle' => $bundle,
        'view_mode' => $entity_view_mode,
      );
      drupal_alter('entity_display', $display, $display_context);
      $displays[$entity_view_mode][$bundle] = $display;
    }
  }
  foreach ($view_modes as $mode => $view_mode_entities) {
    $this
      ->buildContent($view_mode_entities, $displays[$mode], $mode, $langcode);
  }
  $view_hook = "{$this->entityType}_view";
  $build = array(
    '#sorted' => TRUE,
  );
  $weight = 0;
  foreach ($entities as $key => $entity) {
    $entity_view_mode = isset($entity->content['#view_mode']) ? $entity->content['#view_mode'] : $view_mode;
    $display = $displays[$entity_view_mode][$entity
      ->bundle()];
    module_invoke_all($view_hook, $entity, $display, $entity_view_mode, $langcode);
    module_invoke_all('entity_view', $entity, $display, $entity_view_mode, $langcode);
    $build[$key] = $entity->content;

    // We don't need duplicate rendering info in $entity->content.
    unset($entity->content);
    $build[$key] += $this
      ->getBuildDefaults($entity, $entity_view_mode, $langcode);
    $this
      ->alterBuild($build[$key], $entity, $display, $entity_view_mode, $langcode);

    // Assign the weights configured in the display.
    foreach ($display
      ->getComponents() as $name => $options) {
      if (isset($build[$key][$name])) {
        $build[$key][$name]['#weight'] = $options['weight'];
      }
    }
    $build[$key]['#weight'] = $weight++;

    // Allow modules to modify the render array.
    drupal_alter(array(
      $view_hook,
      'entity_view',
    ), $build[$key], $entity, $display);
  }
  return $build;
}