web-dev-qa-db-ja.com

現在のノード言語でReferencedEntityフィールド値を取得する方法

ブロック内にノードのコンテンツを取得しようとしています。

必要なフィールドを取得できましたが、現在の翻訳ではなく、常にサイトのデフォルト言語で返されます(例:/ node/1と/ fr/node/1は、翻訳ではなく同じ英語のコンテンツを返します)

単純なフィールドでは問題なく機能しますが、referencedEntitiesで機能させることはできません。

私はブロックbuild()関数の中にいます:

$node = \Drupal::routeMatch()->getParameter('node');

// Simple text field : Correct value depending on language
$correctValue = $node->field_test_text->getValue(); 

// Paragraphs/referencedEntities
$paras = $node->get('field_paragraphes')->referencedEntities();
foreach ($paras as $para) {
   // Not translated, always in default language ?
   $badValue = $para->get('field_test_in_para')->getValue();
}

どうもありがとう。

3
Flunch

問題のコード(翻訳を取得するにはgetTranslationを使用し、実際に翻訳があるかどうかを確認するにはhasTranslationを使用する必要があります):

$lang_code = \Drupal::service('language_manager')->getCurrentLanguage()->getId();
$node = \Drupal::routeMatch()->getParameter('node');

// Paragraphs/referencedEntities
$paras = $node->get('field_paragraphes')->referencedEntities();
foreach ($paras as $para) {
  // Remember to check if translation exists
  if ($para->hasTranslation($lang_code)) {
    $para = $para->getTranslation($lang_code);
  }
   $goodValue = $para->get('field_test_in_para')->getValue();
}

このコードが機能して問題を修正することはできますが、正しく機能しているかどうかを検討することもできます。ほとんどの場合、適切な方法で物事を行う場合、翻訳を処理する必要はありません。多くのモジュール/システムは、ものをレンダリングするとき、またはビューのようなモジュールを使用するときに、これを自動的に行います。ほとんどの場合、自分で翻訳を処理する必要がある場合、これを行う簡単な方法があります。

10
googletorp

現在の言語の使用を強制することができます:

$langcode = $this->languageManager->getCurrentLanguage()->getId();
$value = $para->getTranslation($langcode)->field_test_in_para->value;

または、ノード言語を使用してみてください:

$node_language = $node->language()->getId();
$value = $para->getTranslation($node_language)->field_test_in_para->value;
5
4k4