web-dev-qa-db-fra.com

Afficher le plugin d'affichage "référence d'entité" n'utilisant pas la traduction

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 ).

enter image description here

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é:

  • Dans mon interface d'administration que j'utilise, j'ai un paragraphe avec un champ ER utilisant une telle vue comme source. Le paragraphe affiche toujours le titre dans la langue par défaut
  • Sur le frontend, j'ai un champ de sélection de formulaire Web utilisant la même vue que la source. Les options de sélection s'affichent toujours dans la langue par défaut.
  • Lorsque j'utilise la méthode de référence par défaut, j'obtiens des titres traduits dans les deux cas d'utilisation.
  • Comme indiqué ci-dessus, la langue correcte est utilisée dans l'aperçu sur/admin/structure/views

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.)

5
Hudri

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();
       }
     }

1
user72672

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 .

4
4k4

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:

enter image description here

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.

1
user72672