$entity) { $post_render_cache =& $build[$id]['links']['#post_render_cache']; unset($post_render_cache['\Drupal\node\NodeViewBuilder::renderLinks']); $new_callback = get_class() . '::renderLinks'; $context = array( 'node_entity_id' => $entity->id(), 'view_mode' => $view_mode, 'langcode' => $langcode, 'in_preview' => !empty($entity->in_preview), ); $placeholder = drupal_render_cache_generate_placeholder($new_callback, $context); $post_render_cache[$new_callback] = [$context]; $build[$id]['links']['#markup'] = $placeholder; } } /** * {@inheritdoc} */ public static function renderLinks(array $element, array $context) { $callback = get_class() . '::renderLinks'; $placeholder = drupal_render_cache_generate_placeholder($callback, $context); $links = array( '#theme' => 'links__node', '#pre_render' => array('drupal_pre_render_links'), '#attributes' => array('class' => array('links', 'inline')), ); if (!$context['in_preview']) { $entity = entity_load('node', $context['node_entity_id'])->getTranslation($context['langcode']); $links['node'] = static::buildLinks($entity, $context['view_mode']); // Allow other modules to alter the node links. $hook_context = array( 'view_mode' => $context['view_mode'], 'langcode' => $context['langcode'], ); \Drupal::moduleHandler()->alter('node_links', $links, $entity, $hook_context); } $markup = drupal_render($links); $element['#markup'] = str_replace($placeholder, $markup, $element['#markup']); return $element; } /** * {@inheritdoc} */ 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 about @title', array( '@title' => $node_title_stripped, ), ['langcode' => $entity->language()->getId()]), 'href' => 'node/' . $entity->id(), 'language' => $entity->language(), 'html' => TRUE, 'attributes' => array( 'rel' => 'tag', 'title' => $node_title_stripped, ), ); } return array( '#theme' => 'links__node__node', '#links' => $links, '#attributes' => array('class' => array('links', 'inline')), ); } }