Mercurial > hg > cmmr2012-drupal-site
diff core/tests/Drupal/Tests/EntityViewTrait.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tests/Drupal/Tests/EntityViewTrait.php Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,71 @@ +<?php + +namespace Drupal\Tests; + +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Render\Element; + +/** + * Provides helper methods to deal with building entity views in tests. + */ +trait EntityViewTrait { + + /** + * Builds the renderable view of an entity. + * + * Entities postpone the composition of their renderable arrays to #pre_render + * functions in order to maximize cache efficacy. This means that the full + * renderable array for an entity is constructed in drupal_render(). Some + * tests require the complete renderable array for an entity outside of the + * drupal_render process in order to verify the presence of specific values. + * This method isolates the steps in the render process that produce an + * entity's renderable array. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity to prepare a renderable array for. + * @param string $view_mode + * (optional) The view mode that should be used to build the entity. + * @param null $langcode + * (optional) For which language the entity should be prepared, defaults to + * the current content language. + * @param bool $reset + * (optional) Whether to clear the cache for this entity. + * @return array + * + * @see \Drupal\Core\Render\RendererInterface::render() + */ + protected function buildEntityView(EntityInterface $entity, $view_mode = 'full', $langcode = NULL, $reset = FALSE) { + $ensure_fully_built = function (&$elements) use (&$ensure_fully_built) { + // If the default values for this element have not been loaded yet, populate + // them. + if (isset($elements['#type']) && empty($elements['#defaults_loaded'])) { + $elements += \Drupal::service('element_info')->getInfo($elements['#type']); + } + + // Make any final changes to the element before it is rendered. This means + // that the $element or the children can be altered or corrected before the + // element is rendered into the final text. + if (isset($elements['#pre_render'])) { + foreach ($elements['#pre_render'] as $callable) { + $elements = call_user_func($callable, $elements); + } + } + + // And recurse. + $children = Element::children($elements, TRUE); + foreach ($children as $key) { + $ensure_fully_built($elements[$key]); + } + }; + + $render_controller = $this->container->get('entity.manager')->getViewBuilder($entity->getEntityTypeId()); + if ($reset) { + $render_controller->resetCache([$entity->id()]); + } + $build = $render_controller->view($entity, $view_mode, $langcode); + $ensure_fully_built($build); + + return $build; + } + +}