web-dev-qa-db-ja.com

EntityQueryが言語に基づいてコンテンツを返さない

特定のコンテンツタイプのすべてのリストを取得しようとしていますが、entityQueryはサイトの元の言語(英語)のみを返しています。これが私のコードです:

  public function fetchDocumentReferenceOptions() {
$language = \Drupal::languageManager()->getCurrentLanguage()->getId();
$query = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'document')
  ->condition('langcode', $language)
  ->sort('title', 'ASC');

$nids = $query->execute();

$nodes = node_load_multiple($nids);

$options = [];

foreach($nodes as $node)
{
  // check if the document (content type) has an uploaded file
  if ($node->field_document->entity) {
      $options[$node->id()] = $node->getTitle();
  }
}

return $options;

}

これは私が関数を呼び出す方法です:

'#options' => $DocumentReferenceCore->fetchDocumentReferenceOptions(),

Langcodeの条件に基づいて私が期待していることは、たとえば、中国語ノード(元の英語ノードから翻訳されたもの)を編集している場合、中国語ノードが表示され、コンテンツが返されるはずですが、代わりに元の英語のコンテンツがまだ表示されています。

ここで何が悪いのですか?

2
SuperTony

コンテンツエンティティにはアクティブな言語の概念があります。それらをロードすると、デフォルトでは、デフォルトの変換の戻り値が返されます。

クエリを使用すると、その翻訳があることがわかっているので、$ node = $ node-> getTranslation($ language);を実行できます。存在するかどうかわからない場合は、$custom_tag = \Drupal::service('entity.repository')->getTranslationFromContext($node, $desired_langcode);を使用できます。一致する翻訳が存在する場合は、そのノードが返されます。言語コードを省略しても、デフォルトで現在のコンテンツの言語が使用されます。

4
Berdir