diff --git a/core/modules/views/src/Entity/Render/CurrentLanguageRenderer.php b/core/modules/views/src/Entity/Render/CurrentLanguageRenderer.php index 454adcc..8ade3e2 100644 --- a/core/modules/views/src/Entity/Render/CurrentLanguageRenderer.php +++ b/core/modules/views/src/Entity/Render/CurrentLanguageRenderer.php @@ -7,21 +7,9 @@ namespace Drupal\views\Entity\Render; -use Drupal\views\ResultRow; - /** * Renders entities in the current language. */ class CurrentLanguageRenderer extends RendererBase { - /** - * Returns NULL so that the current language is used. - * - * @param \Drupal\views\ResultRow $row - * The result row. - */ - protected function getLangcode(ResultRow $row) { - return $this->langcode; - } - } diff --git a/core/modules/views/src/Entity/Render/DefaultLanguageRenderer.php b/core/modules/views/src/Entity/Render/DefaultLanguageRenderer.php index 2e99c12..bab75d8 100644 --- a/core/modules/views/src/Entity/Render/DefaultLanguageRenderer.php +++ b/core/modules/views/src/Entity/Render/DefaultLanguageRenderer.php @@ -15,15 +15,9 @@ class DefaultLanguageRenderer extends RendererBase { /** - * Returns the language code associated to the given row. - * - * @param \Drupal\views\ResultRow $row - * The result row. - * - * @return string - * A language code. + * {@inheritdoc} */ - protected function getLangcode(ResultRow $row) { + public function getLangcode(ResultRow $row) { return $row->_entity->getUntranslated()->language()->getId(); } diff --git a/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php new file mode 100644 index 0000000..e9a4fbf --- /dev/null +++ b/core/modules/views/src/Entity/Render/EntityTranslationRenderTrait.php @@ -0,0 +1,92 @@ +entityLanguageRenderer)) { + $view = $this->getView(); + $rendering_language = $view->display_handler->getOption('rendering_language'); + $langcode = NULL; + $dynamic_renderers = array( + '***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 = 'CurrentLanguageRenderer'; + } + $class = '\Drupal\views\Entity\Render\\' . $renderer; + $entity_type = $this->getEntityManager()->getDefinition($this->getEntityTypeId()); + $this->entityLanguageRenderer = new $class($view, $this->getLanguageManager(), $entity_type, $langcode); + } + return $this->entityLanguageRenderer; + } + + /** + * 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(); + +} diff --git a/core/modules/views/src/Entity/Render/RendererBase.php b/core/modules/views/src/Entity/Render/RendererBase.php index ef8e388..f562eb8 100644 --- a/core/modules/views/src/Entity/Render/RendererBase.php +++ b/core/modules/views/src/Entity/Render/RendererBase.php @@ -73,6 +73,19 @@ public function __construct(ViewExecutable $view, LanguageManagerInterface $lang } /** + * Returns the language code associated to the given row. + * + * @param \Drupal\views\ResultRow $row + * The result row. + * + * @return string + * A language code. + */ + public function getLangcode(ResultRow $row) { + return $this->langcode; + } + + /** * Alters the query if needed. * * @param \Drupal\views\Plugin\views\query\QueryPluginBase $query diff --git a/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php b/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php index 9b0e0da..58c8ff0 100644 --- a/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php +++ b/core/modules/views/src/Entity/Render/TranslationLanguageRenderer.php @@ -13,7 +13,7 @@ /** * Renders entity translations in their active language. */ -class TranslationLanguageRenderer extends DefaultLanguageRenderer { +class TranslationLanguageRenderer extends RendererBase { /** * Stores the field alias of the langcode column. @@ -71,7 +71,7 @@ public function render(ResultRow $row) { /** * {@inheritdoc} */ - protected function getLangcode(ResultRow $row) { + public function getLangcode(ResultRow $row) { return isset($row->{$this->langcodeAlias}) ? $row->{$this->langcodeAlias} : $this->languageManager->getDefaultLanguage()->getId(); } diff --git a/core/modules/views/src/Plugin/views/field/Field.php b/core/modules/views/src/Plugin/views/field/Field.php index 5d4688f..4a0840a 100644 --- a/core/modules/views/src/Plugin/views/field/Field.php +++ b/core/modules/views/src/Plugin/views/field/Field.php @@ -11,9 +11,7 @@ use Drupal\Component\Utility\Xss; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityManagerInterface; -use Drupal\Core\Entity\EntityStorageInterface; use Drupal\Core\Field\BaseFieldDefinition; -use Drupal\Core\Field\FieldConfigInterface; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\Field\FieldTypePluginManagerInterface; use Drupal\Core\Field\FormatterPluginManager; @@ -24,14 +22,11 @@ use Drupal\Core\Render\Element; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Session\AccountInterface; -use Drupal\field\FieldStorageConfigInterface; +use Drupal\views\Entity\Render\EntityTranslationRenderTrait; use Drupal\views\Plugin\CacheablePluginInterface; use Drupal\views\Plugin\views\display\DisplayPluginBase; -use Drupal\views\Plugin\views\field\FieldPluginBase; -use Drupal\views\Plugin\views\field\MultiItemsFieldHandlerInterface; use Drupal\views\ResultRow; use Drupal\views\ViewExecutable; -use Drupal\views\Views; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -44,6 +39,7 @@ * @ViewsField("field") */ class Field extends FieldPluginBase implements CacheablePluginInterface, MultiItemsFieldHandlerInterface { + use EntityTranslationRenderTrait; /** * An array to store field renderable arrays for use by renderItems(). @@ -248,6 +244,33 @@ public function init(ViewExecutable $view, DisplayPluginBase $display, array &$o /** * {@inheritdoc} */ + public function getEntityTypeId() { + return $this->getEntityType(); + } + + /** + * {@inheritdoc} + */ + protected function getEntityManager() { + return $this->entityManager; + } + + /** + * {@inheritdoc} + */ + protected function getLanguageManager() { + return $this->languageManager; + } + /** + * {@inheritdoc} + */ + protected function getView() { + return $this->view; + } + + /** + * {@inheritdoc} + */ public function access(AccountInterface $account) { $access_control_handler = $this->entityManager->getAccessControlHandler($this->getEntityType()); return $access_control_handler->fieldAccess('view', $this->getFieldDefinition(), $account); @@ -303,6 +326,8 @@ public function query($use_groupby = FALSE) { $this->query->addWhereExpression(0, "$column IN($placeholder) OR $column IS NULL", array($placeholder => $langcode_fallback_candidates)); } } + + $this->getEntityLanguageRenderer()->query($this->query); } /** @@ -796,7 +821,7 @@ public function getItems(ResultRow $values) { function process_entity(ResultRow $values, EntityInterface $entity) { $processed_entity = clone $entity; - $langcode = $this->fieldLangcodeAvailable($processed_entity); + $langcode = $this->fieldLangcodeAvailable($processed_entity, $values); $processed_entity = $processed_entity->getTranslation($langcode); // If we are grouping, copy our group fields into the cloned entity. @@ -927,9 +952,9 @@ protected function addSelfTokens(&$tokens, $item) { * Return the language code of the language the field should be displayed in, * according to the settings. */ - function fieldLangcodeAvailable(EntityInterface $entity) { + public function fieldLangcodeAvailable(EntityInterface $entity, ResultRow $row) { if ($this->getFieldDefinition()->isTranslatable()) { - $langcode = $this->fieldLangcodeConfigured(); + $langcode = $this->fieldLangcodeConfigured($row); // Give the Entity Field API a chance to fallback to a different language // (or LanguageInterface::LANGCODE_NOT_SPECIFIED), in case the field has @@ -948,21 +973,14 @@ function fieldLangcodeAvailable(EntityInterface $entity) { /** * Resolve the language code to be used for fields. * + * @param \Drupal\views\ResultRow $row + * (optional) The result row. Defaults to NULL. + * * @return string * Language code to be used. */ - protected function fieldLangcodeConfigured() { - $langcode = $this->view->display_handler->options['rendering_language']; - $substitutions = static::queryLanguageSubstitutions(); - $substitutions += array( - // @todo Backwards compatible fallback, needs to be implemented. - '***LANGUAGE_entity_translation***' => $this->languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT), - '***LANGUAGE_entity_default***' => LanguageInterface::LANGCODE_DEFAULT, - ); - if (isset($substitutions[$langcode])) { - $langcode = $substitutions[$langcode]; - } - return $langcode; + protected function fieldLangcodeConfigured(ResultRow $row = NULL) { + return $this->getEntityLanguageRenderer()->getLangcode($row); } /** diff --git a/core/modules/views/src/Plugin/views/row/EntityRow.php b/core/modules/views/src/Plugin/views/row/EntityRow.php index 69b53de..8036dfc 100644 --- a/core/modules/views/src/Plugin/views/row/EntityRow.php +++ b/core/modules/views/src/Plugin/views/row/EntityRow.php @@ -8,10 +8,10 @@ namespace Drupal\views\Plugin\views\row; use Drupal\Component\Utility\String; -use Drupal\Core\DependencyInjection\Container; use Drupal\Core\Entity\EntityManagerInterface; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Language\LanguageManagerInterface; +use Drupal\views\Entity\Render\EntityTranslationRenderTrait; use Drupal\views\Plugin\views\display\DisplayPluginBase; use Drupal\views\ViewExecutable; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -25,6 +25,7 @@ * ) */ class EntityRow extends RowPluginBase { + use EntityTranslationRenderTrait; /** * The table the entity is using for storage. @@ -55,13 +56,6 @@ class EntityRow extends RowPluginBase { protected $entityType; /** - * The renderer to be used to render the entity row. - * - * @var \Drupal\views\Entity\Rendering\RendererBase - */ - protected $renderer; - - /** * The entity manager. * * @var \Drupal\Core\Entity\EntityManagerInterface @@ -110,6 +104,34 @@ public static function create(ContainerInterface $container, array $configuratio } /** + * {@inheritdoc} + */ + public function getEntityTypeId() { + return $this->entityType->id(); + } + + /** + * {@inheritdoc} + */ + protected function getEntityManager() { + return $this->entityManager; + } + + /** + * {@inheritdoc} + */ + protected function getLanguageManager() { + return $this->languageManager; + } + + /** + * {@inheritdoc} + */ + protected function getView() { + return $this->view; + } + + /** * Overrides Drupal\views\Plugin\views\row\RowPluginBase::defineOptions(). */ protected function defineOptions() { @@ -146,45 +168,11 @@ public function summaryTitle() { } /** - * Returns the current renderer. - * - * @return \Drupal\views\Entity\Render\RendererBase - * The configured renderer. - */ - protected function getRenderer() { - if (!isset($this->renderer)) { - $renderer = $this->displayHandler->getOption('rendering_language'); - $langcode = NULL; - $dynamic_renderers = array( - '***LANGUAGE_entity_translation***' => 'TranslationLanguageRenderer', - '***LANGUAGE_entity_default***' => 'DefaultLanguageRenderer', - ); - if (isset($dynamic_renderers[$renderer])) { - // Dynamic language set based on result rows or instance defaults. - $renderer = $dynamic_renderers[$renderer]; - } - else { - if (strpos($renderer, '***LANGUAGE_') !== FALSE) { - $langcode = static::queryLanguageSubstitutions()[$renderer]; - } - else { - // Specific langcode set. - $langcode = $renderer; - } - $renderer = 'CurrentLanguageRenderer'; - } - $class = '\Drupal\views\Entity\Render\\' . $renderer; - $this->renderer = new $class($this->view, $this->languageManager, $this->entityType, $langcode); - } - return $this->renderer; - } - - /** * {@inheritdoc} */ public function query() { parent::query(); - $this->getRenderer()->query($this->view->getQuery()); + $this->getEntityLanguageRenderer()->query($this->view->getQuery()); } /** @@ -193,7 +181,7 @@ public function query() { public function preRender($result) { parent::preRender($result); if ($result) { - $this->getRenderer()->preRender($result); + $this->getEntityLanguageRenderer()->preRender($result); } } @@ -201,7 +189,7 @@ public function preRender($result) { * Overrides Drupal\views\Plugin\views\row\RowPluginBase::render(). */ public function render($row) { - return $this->getRenderer()->render($row); + return $this->getEntityLanguageRenderer()->render($row); } /**