更新:このバグは 問題21746 およびDrupal v8.7.9で修正されました。この問題はなくなりました。
エンティティ参照フィールドの一部について、参照メソッドとして「ビュー:エンティティ参照ビューによるフィルター」を使用しています。レンダリングに現在のインターフェース言語を使用するようにこれらのビューを構成しました( デフォルトの言語へのフォールバック付き )。
インターフェイス言語の選択は基本的には機能しますが(他のビューブロックで、または/ admin/structure/viewsでプレビューするとき)、エンティティ参照フィールドのソースとして使用すると機能しません。
ビューでフィルタリングされたERフィールドに正しい言語を選択するにはどうすればよいですか?
(これは言語のフォールバックを無効にするため、フィルター言語としてインターフェース言語を使用できないことに注意してください。)
依存関係注入も使用する@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();
}
}
TermSelection :: getReferenceableEntities と ViewsSelection :: 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 が修正され、選択プラグインがビューの出力を無視するという根本的な問題を解決すると、これはもう必要ありません。 。