言語スイッチャーで選択されている言語に基づいて、メニュー項目のリンクを動的に変更しようとしています。
メインメニューに次のリンクがあるとします。
-ホーム
-約
-製品
選択した言語が英語の場合、Aboutアイテムをnode/73にリンクします。選択した言語がオランダ語の場合、Aboutアイテムをnode/74にリンクします。
これは可能ですか?これについてどうすればいいですか?
どんな助けでも大歓迎です。
編集:いくつかの追加情報。国際化、コンテンツ翻訳、エンティティ翻訳モジュールがインストールされています。メニューの階層と、コンテンツ翻訳ノードとエンティティ翻訳ノードの混在のため、メニューに2つの別々のリンクを追加するのではなく、1つのリンクを使用して、コードで動的にパスを変更します。
hook_translated_menu_link_alter() を実装したい。
このフックは、すべてのメニュー項目に対して呼び出されるわけではありません。 APIドキュメントによると:
$ item ['options'] ['alter']が空ではない値(例:TRUE)に設定されている場合にのみ呼び出されます。このフラグは、hook_menu_link_alter()を使用して設定する必要があります。
次に例を示します。
function MODULE_menu_link_alter(&$link) {
if ($link['link_title'] == 'foo') {
$link['options']['alter'] = TRUE;
}
}
function MODULE_translated_menu_link_alter(&$link) {
if ($link['link_title'] == 'foo') {
$link['href'] = 'node/5';
}
}
いくつかのメモ:
参考までに、この手法はuser.moduleのコアによって実装されます( ser_menu_link_alter および ser_translated_menu_link_alter を参照)および menu_token モジュールによって実装されます。
Internationalization モジュールをインストールすると、メニュー構成ページで言語を選択できます(例:admin/structure/menu/manage/main-menu/add)。言語を選択し、言語のそれぞれのパスを設定します。
2つの言語がある場合は、言語ごとに2つのメニュー項目を作成する必要があります。次に、言語を選択すると、それぞれの言語のメニュー項目が表示されます。
数日かけて頭をぶち壊した後、私はようやく自分の問題を解決する方法を見つけました!!!
したがって、少し要約します。3つのノードがあり、それらは相互に翻訳されています(コンテンツ翻訳あり)。
ノード157 =英語
ノード158 =オランダ語
ノード159 =フランス語
インターフェイス言語に基づいて正しいノードを動的に表示するメニュー項目が必要でした。しかし、3つの別個のメニュー項目を作成できませんでした。このメニュー項目には、エンティティの翻訳で翻訳されるノードへの子リンクがいくつかあるためです。次に、トランスライオンのメニューがメニューに表示されなかったため、メニューの表示に問題がありました。簡単に言えば、ここに私が使用したコードがあります:
mymodule.module
function mymodule_node_view($node, $view_mode, $langcode) {
if($node->nid == 157) {
if($langcode == 'nl') {
drupal_goto('node/158');
}elseif($langcode == 'fr') {
drupal_goto('node/159');
}
} elseif($node->nid == 158 || $node->nid == 159) {
menu_tree_set_path('main-menu', 'node/157');
}
}
template.php
function mytheme_preprocess_page(&$variables) {
if(!empty($variables['node'])){
switch ($variables['node']->nid) {
case 158:
$variables['node']->title = '';
menu_set_active_item('node/157');
break;
case 159:
$variables['node']->title = '';
menu_set_active_item('node/157');
break;
}
}
}
これが意味をなさない場合は、遠慮なく私に尋ねてください。私はそれを自分でほとんど理解できませんが、トリックを行います!