diff core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children af1871eacc83
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,114 @@
+<?php
+
+namespace Drupal\views\Entity\Render;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\TypedData\TranslatableInterface;
+use Drupal\views\Plugin\views\PluginBase;
+use Drupal\views\ResultRow;
+
+/**
+ * Trait used to instantiate the view's entity translation renderer.
+ */
+trait EntityTranslationRenderTrait {
+
+  /**
+   * The renderer to be used to render the entity row.
+   *
+   * @var \Drupal\views\Entity\Render\EntityTranslationRendererBase
+   */
+  protected $entityTranslationRenderer;
+
+  /**
+   * Returns the current renderer.
+   *
+   * @return \Drupal\views\Entity\Render\EntityTranslationRendererBase
+   *   The configured renderer.
+   */
+  protected function getEntityTranslationRenderer() {
+    if (!isset($this->entityTranslationRenderer)) {
+      $view = $this->getView();
+      $rendering_language = $view->display_handler->getOption('rendering_language');
+      $langcode = NULL;
+      $dynamic_renderers = [
+        '***LANGUAGE_entity_translation***' => 'TranslationLanguageRenderer',
+        '***LANGUAGE_entity_default***' => 'DefaultLanguageRenderer',
+      ];
+      if (isset($dynamic_renderers[$rendering_language])) {
+        // Dynamic language set based on result rows or instance defaults.
+        $renderer = $dynamic_renderers[$rendering_language];
+      }
+      else {
+        if (strpos($rendering_language, '***LANGUAGE_') !== FALSE) {
+          $langcode = PluginBase::queryLanguageSubstitutions()[$rendering_language];
+        }
+        else {
+          // Specific langcode set.
+          $langcode = $rendering_language;
+        }
+        $renderer = 'ConfigurableLanguageRenderer';
+      }
+      $class = '\Drupal\views\Entity\Render\\' . $renderer;
+      $entity_type = $this->getEntityManager()->getDefinition($this->getEntityTypeId());
+      $this->entityTranslationRenderer = new $class($view, $this->getLanguageManager(), $entity_type, $langcode);
+    }
+    return $this->entityTranslationRenderer;
+  }
+
+  /**
+   * Returns the entity translation matching the configured row language.
+   *
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   The entity object the field value being processed is attached to.
+   * @param \Drupal\views\ResultRow $row
+   *   The result row the field value being processed belongs to.
+   *
+   * @return \Drupal\Core\Entity\FieldableEntityInterface
+   *   The entity translation object for the specified row.
+   */
+  public function getEntityTranslation(EntityInterface $entity, ResultRow $row) {
+    // We assume the same language should be used for all entity fields
+    // belonging to a single row, even if they are attached to different entity
+    // types. Below we apply language fallback to ensure a valid value is always
+    // picked.
+    $translation = $entity;
+    if ($entity instanceof TranslatableInterface && count($entity->getTranslationLanguages()) > 1) {
+      $langcode = $this->getEntityTranslationRenderer()->getLangcode($row);
+      $translation = $this->getEntityManager()->getTranslationFromContext($entity, $langcode);
+    }
+    return $translation;
+  }
+
+  /**
+   * Returns the entity type identifier.
+   *
+   * @return string
+   *   The entity type identifier.
+   */
+  abstract public function getEntityTypeId();
+
+  /**
+   * Returns the entity manager.
+   *
+   * @return \Drupal\Core\Entity\EntityManagerInterface
+   *   The entity manager.
+   */
+  abstract protected function getEntityManager();
+
+  /**
+   * Returns the language manager.
+   *
+   * @return \Drupal\Core\Language\LanguageManagerInterface
+   *   The language manager.
+   */
+  abstract protected function getLanguageManager();
+
+  /**
+   * Returns the top object of a view.
+   *
+   * @return \Drupal\views\ViewExecutable
+   *   The view object.
+   */
+  abstract protected function getView();
+
+}