web-dev-qa-db-ja.com

現在の言語に基づいてノードをロードする方法は?

ノードエンティティに2つのコンテンツバンドルがあります。

  1. カスタムレイアウトページ(custom_layout)
  2. レシピ(レシピ)

次に、これらのコンテンツタイプであるPotato(レシピ)とHomepage(custom_layout)を使用して2つのコンテンツを作成しました。

コンテンツにはenとfrの2つの言語があります。ポテトレシピノードをホームページのコンテンツ内にロードしようとしています。

したがって、前処理フックの中に、私はこのコードを持っています

... if(isset($vars['node']) && $vars['node']->type === 'custom_layout'){ $recipe_id = 10; $vars['recipe_side'] = render(node_view(node_load($recipe_id))); } ...

次に、custom_layoutテンプレートファイルの$ recipe_sideをエコーし​​ます。

ページのfrバージョンをロードすると、レシピもfrにロードされるはずでしたが、常にenバージョンが表示されます。

EnレシピのノードIDが10で、翻訳されたノードをロードしないためだと思います。

その場合、読み込まれたノードが現在の言語に従うようにするにはどうすればよいですか?

2
hamahama

このコードを試してください:

 $node_trad = node_load($variables["node"]->nid); // in your case, 10.
 $idi_trad = translation_node_get_translations($node_trad->tnid);

  $vars['recipe_side'] = render(node_view(node_load($idi_trad["fr"]->nid)));
  //$vars['recipe_side'] = render(node_view(node_load($idi_trad[$language->language]->nid)));
  // alternative, more dynamical                

基本的に、ノードを元の言語でロードし、translation関数を使用して使用可能なすべての翻訳を取得し、必要なものを使用します。 「fr」の代わりに、language->languageを使用して完全に動的にすることができます。

1
Cesar

次のコードを使用して、現在の言語のTRANSLATEDノードを取得します。


$node_id = 10;  // Put the node ID here where you want the translation for.
$translation_node = translation_node_get( $node_id );

// Show the translated node
print_r( $translation_node );

function translation_node_get( $node_id )
{
    if ( is_numeric($node_id) && $node_id > 0 )
    {
        // Get current language code
        global $language;
        $lang_code = $language->language;

        // Get translation node id
        $base_node = node_load( $node_id );
        $tnid = $base_node->tnid;

        // Search the database for the translated node of the current language
        $result = db_select('node', 'n')
        ->fields('n', array('nid', 'type', 'uid', 'status', 'title', 'language'))
        ->condition('n.tnid', $tnid)
        ->condition('n.language', $lang_code)
        ->addTag('node_access')
        ->execute();

        foreach ( $result as $trans_node )
        {
            // Return the correct language node
            return node_load( $trans_node->nid );
        }
    }

    // No translation node found!
    return false;
}
0
Sjoerd Linders