Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 79 |
| NodeViewBuilder | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
210 | |
0.00% |
0 / 79 |
| buildComponents | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 28 |
|||
| getBuildDefaults | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 6 |
|||
| renderLinks | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 16 |
|||
| buildLinks | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 21 |
|||
| alterBuild | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 8 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\node\NodeViewBuilder. | |
| */ | |
| namespace Drupal\node; | |
| use Drupal\Core\Entity\Display\EntityViewDisplayInterface; | |
| use Drupal\Core\Entity\EntityInterface; | |
| use Drupal\Core\Entity\EntityViewBuilder; | |
| use Drupal\node\Entity\Node; | |
| /** | |
| * Render controller for nodes. | |
| */ | |
| class NodeViewBuilder extends EntityViewBuilder { | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildComponents(array &$build, array $entities, array $displays, $view_mode) { | |
| /** @var \Drupal\node\NodeInterface[] $entities */ | |
| if (empty($entities)) { | |
| return; | |
| } | |
| parent::buildComponents($build, $entities, $displays, $view_mode); | |
| foreach ($entities as $id => $entity) { | |
| $bundle = $entity->bundle(); | |
| $display = $displays[$bundle]; | |
| if ($display->getComponent('links')) { | |
| $build[$id]['links'] = array( | |
| '#lazy_builder' => [get_called_class() . '::renderLinks', [ | |
| $entity->id(), | |
| $view_mode, | |
| $entity->language()->getId(), | |
| !empty($entity->in_preview), | |
| ]], | |
| ); | |
| } | |
| // Add Language field text element to node render array. | |
| if ($display->getComponent('langcode')) { | |
| $build[$id]['langcode'] = array( | |
| '#type' => 'item', | |
| '#title' => t('Language'), | |
| '#markup' => $entity->language()->getName(), | |
| '#prefix' => '<div id="field-language-display">', | |
| '#suffix' => '</div>' | |
| ); | |
| } | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function getBuildDefaults(EntityInterface $entity, $view_mode) { | |
| $defaults = parent::getBuildDefaults($entity, $view_mode); | |
| // Don't cache nodes that are in 'preview' mode. | |
| if (isset($defaults['#cache']) && isset($entity->in_preview)) { | |
| unset($defaults['#cache']); | |
| } | |
| return $defaults; | |
| } | |
| /** | |
| * #lazy_builder callback; builds a node's links. | |
| * | |
| * @param string $node_entity_id | |
| * The node entity ID. | |
| * @param string $view_mode | |
| * The view mode in which the node entity is being viewed. | |
| * @param string $langcode | |
| * The language in which the node entity is being viewed. | |
| * @param bool $is_in_preview | |
| * Whether the node is currently being previewed. | |
| * | |
| * @return array | |
| * A renderable array representing the node links. | |
| */ | |
| public static function renderLinks($node_entity_id, $view_mode, $langcode, $is_in_preview) { | |
| $links = array( | |
| '#theme' => 'links__node', | |
| '#pre_render' => array('drupal_pre_render_links'), | |
| '#attributes' => array('class' => array('links', 'inline')), | |
| ); | |
| if (!$is_in_preview) { | |
| $entity = Node::load($node_entity_id)->getTranslation($langcode); | |
| $links['node'] = static::buildLinks($entity, $view_mode); | |
| // Allow other modules to alter the node links. | |
| $hook_context = array( | |
| 'view_mode' => $view_mode, | |
| 'langcode' => $langcode, | |
| ); | |
| \Drupal::moduleHandler()->alter('node_links', $links, $entity, $hook_context); | |
| } | |
| return $links; | |
| } | |
| /** | |
| * Build the default links (Read more) for a node. | |
| * | |
| * @param \Drupal\node\NodeInterface $entity | |
| * The node object. | |
| * @param string $view_mode | |
| * A view mode identifier. | |
| * | |
| * @return array | |
| * An array that can be processed by drupal_pre_render_links(). | |
| */ | |
| protected static function buildLinks(NodeInterface $entity, $view_mode) { | |
| $links = array(); | |
| // Always display a read more link on teasers because we have no way | |
| // to know when a teaser view is different than a full view. | |
| if ($view_mode == 'teaser') { | |
| $node_title_stripped = strip_tags($entity->label()); | |
| $links['node-readmore'] = array( | |
| 'title' => t('Read more<span class="visually-hidden"> about @title</span>', array( | |
| '@title' => $node_title_stripped, | |
| )), | |
| 'url' => $entity->urlInfo(), | |
| 'language' => $entity->language(), | |
| 'attributes' => array( | |
| 'rel' => 'tag', | |
| 'title' => $node_title_stripped, | |
| ), | |
| ); | |
| } | |
| return array( | |
| '#theme' => 'links__node__node', | |
| '#links' => $links, | |
| '#attributes' => array('class' => array('links', 'inline')), | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function alterBuild(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) { | |
| /** @var \Drupal\node\NodeInterface $entity */ | |
| parent::alterBuild($build, $entity, $display, $view_mode); | |
| if ($entity->id()) { | |
| $build['#contextual_links']['node'] = array( | |
| 'route_parameters' =>array('node' => $entity->id()), | |
| 'metadata' => array('changed' => $entity->getChangedTime()), | |
| ); | |
| } | |
| } | |
| } |