web-dev-qa-db-ja.com

翻訳を使用しない表示プラグイン「エンティティ参照」を表示

更新:このバグは 問題21746 およびDrupal v8.7.9で修正されました。この問題はなくなりました。

エンティティ参照フィールドの一部について、参照メソッドとして「ビュー:エンティティ参照ビューによるフィルター」を使用しています。レンダリングに現在のインターフェース言語を使用するようにこれらのビューを構成しました( デフォルトの言語へのフォールバック付き )。

enter image description here

インターフェイス言語の選択は基本的には機能しますが(他のビューブロックで、または/ admin/structure/viewsでプレビューするとき)、エンティティ参照フィールドのソースとして使用すると機能しません。

  • 私の管理インターフェイスでは、このようなビューをソースとして使用して、ERフィールドを持つ段落を取得しています。段落には常にデフォルトの言語でタイトルが表示されます
  • フロントエンドには、ソースと同じビューを使用するWebフォーム選択フィールドがあります。選択オプションは常にデフォルトの言語でレンダリングされます。
  • デフォルトの参照方法を使用すると、両方の使用例でタイトルが翻訳されます。
  • 上記のように、/ admin/structure/viewsのプレビューでは正しい言語が使用されます

ビューでフィルタリングされたERフィールドに正しい言語を選択するにはどうすればよいですか?

(これは言語のフォールバックを無効にするため、フィルター言語としてインターフェース言語を使用できないことに注意してください。)

5
Hudri

依存関係注入も使用する@4k4's回答のパッチを作成しました。

このパッチを適用するには:

以下のコードスニペットを取り、新しいファイルに貼り付けます(例:test.patch)。

次に、git apply /path-to-file/test.patchを実行します。

UIのみのソリューションについては、他の回答を参照してください。

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

TermSelection :: getReferenceableEntitiesViewsSelection :: getReferenceableEntities を比較すると、エンティティラベルを返す前にビューエンティティ参照選択プラグインがエンティティを変換しないようです。 1行追加するコアパッチで動作するはずです。

/ 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;
}

編集:

https://www.drupal.org/project/drupal/issues/21746 が修正され、選択プラグインがビューの出力を無視するという根本的な問題を解決すると、これはもう必要ありません。 。

4
4k4

Appleコアパッチを使用したくない場合のUIソリューションを次に示します。

translation_viewsモジュールを使用する必要があります。

以下は、必要なフィルター構成のスクリーンショットです。

enter image description here

ロジックは単純で、ノードに翻訳がない場合は元の言語が表示され、それ以外の場合は翻訳言語が表示されます。

translation_viewsモジュールを使用してTranslation counter filterを取得します。

1
user72672