MISE À JOUR: Ce bogue vient d'être corrigé dans problème 21746 et Drupal v8.7.9 n'aura plus ce problème.
Pour certains de mes champs de référence d'entité, j'utilise "Vues: filtrer par une vue de référence d'entité" comme méthode de référence. J'ai configuré ces vues pour utiliser la langue d'interface actuelle pour le rendu ( avec repli sur la langue par défaut ).
La sélection de la langue de l'interface fonctionne essentiellement (dans d'autres blocs de vue, ou lors de la prévisualisation dans/admin/structure/vues), mais elle ne fonctionne pas lorsqu'elle est utilisée comme source pour un champ de référence d'entité:
Comment puis-je sélectionner la langue appropriée pour mes champs ER filtrés par vue?
(Veuillez noter que je ne peux pas utiliser la langue de l'interface comme critère de filtrage, car cela désactiverait le repli de la langue.)
J'ai créé un patch pour @4k4's
réponse qui utilise également l'injection de dépendances.
Pour appliquer ce patch:
Prenez l'extrait de code ci-dessous et collez-le dans un nouveau fichier, par exemple test.patch
.
Exécutez ensuite git apply /path-to-file/test.patch
.
Pour une solution d'interface utilisateur uniquement, consultez mon autre réponse.
diff --git a/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php b/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
index 79707af..e092ba9 100644
--- a/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
+++ b/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php
@@ -4,6 +4,7 @@
use Drupal\Core\DependencyInjection\DeprecatedServicePropertyTrait;
use Drupal\Core\Entity\EntityReferenceSelection\SelectionPluginBase;
+use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
@@ -59,6 +60,13 @@ class ViewsSelection extends SelectionPluginBase implements ContainerFactoryPlug
*/
protected $currentUser;
+ /**
+ * The entity repository.
+ *
+ * @var EntityRepositoryInterface
+ */
+ protected $entityRepository;
+
/**
* Constructs a new ViewsSelection object.
*
@@ -74,13 +82,16 @@ class ViewsSelection extends SelectionPluginBase implements ContainerFactoryPlug
* The module handler service.
* @param \Drupal\Core\Session\AccountInterface $current_user
* The current user.
+ * @param \Drupal\Core\Entity\EntityRepositoryInterface $entityRepository
+ * The entity repository.
*/
- public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user) {
+ public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, ModuleHandlerInterface $module_handler, AccountInterface $current_user, EntityRepositoryInterface $entityRepository) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
$this->moduleHandler = $module_handler;
$this->currentUser = $current_user;
+ $this->entityRepository = $entityRepository;
}
/**
@@ -93,7 +104,8 @@ public static function create(ContainerInterface $container, array $configuratio
$plugin_definition,
$container->get('entity_type.manager'),
$container->get('module_handler'),
- $container->get('current_user')
+ $container->get('current_user'),
+ $container->get('entity.repository')
);
}
@@ -231,6 +243,7 @@ public function getReferenceableEntities($match = NULL, $match_operator = 'CONTA
if ($result) {
foreach ($this->view->result as $row) {
$entity = $row->_entity;
+ $entity = $this->entityRepository->getTranslationFromContext($entity);
$return[$entity->bundle()][$entity->id()] = $entity->label();
}
}
En comparant TermSelection :: getReferenceableEntities et ViewsSelection :: getReferenceableEntities il semble que le plug-in de sélection de référence d'entité Views ne traduit pas l'entité avant de renvoyer les étiquettes d'entité. Cela devrait fonctionner avec un patch principal ajoutant une ligne:
/core/modules/views/src/Plugin/EntityReferenceSelection/ViewsSelection.php:
public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
$display_name = $this->getConfiguration()['view']['display_name'];
$arguments = $this->getConfiguration()['view']['arguments'];
$result = [];
if ($this->initializeView($match, $match_operator, $limit)) {
// Get the results.
$result = $this->view->executeDisplay($display_name, $arguments);
}
$return = [];
if ($result) {
foreach ($this->view->result as $row) {
$entity = $row->_entity;
// add this line to translate the entity
$entity = \Drupal::service('entity.repository')->getTranslationFromContext($entity);
$return[$entity->bundle()][$entity->id()] = $entity->label();
}
}
return $return;
}
Éditer:
Cela ne sera plus nécessaire lorsque https://www.drupal.org/project/drupal/issues/21746 est corrigé, puis résout le problème sous-jacent, que le plug-in de sélection ignore la sortie des vues .
Voici une solution d'interface utilisateur si vous ne voulez pas Apple un patch principal.
Vous devrez utiliser le translation_views
module.
Voici une capture d'écran de la configuration de filtre nécessaire:
La logique est simple, si le nœud n'a pas de traductions, affichez la langue d'origine, sinon affichez la langue de traduction.
Je utilise l translation_views
module pour obtenir le Translation counter filter
.