web-dev-qa-db-ja.com

メニューリンクを動的に変更するにはどうすればよいですか? (D7)

言語スイッチャーで選択されている言語に基づいて、メニュー項目のリンクを動的に変更しようとしています。

メインメニューに次のリンクがあるとします。
-ホーム
-約
-製品

選択した言語が英語の場合、Aboutアイテムをnode/73にリンクします。選択した言語がオランダ語の場合、Aboutアイテムをnode/74にリンクします。

これは可能ですか?これについてどうすればいいですか?

どんな助けでも大歓迎です。

編集:いくつかの追加情報。国際化、コンテンツ翻訳、エンティティ翻訳モジュールがインストールされています。メニューの階層と、コンテンツ翻訳ノードとエンティティ翻訳ノードの混在のため、メニューに2つの別々のリンクを追加するのではなく、1つのリンクを使用して、コードで動的にパスを変更します。

5
Smos

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';
  }
}

いくつかのメモ:

  • $ link ['menu_name']でさらにフィルタリングすることができます
  • MODULE_menu_link_alter()は、hook_menu()を介して宣言されたすべてのメニュー項目のキャッシュクリアで呼び出されます。
  • Web経由で作成されたメニュー項目の場合、それはsaveでのみ呼び出されます。つまり、このコードを有効にするには、メニューリンクを編集して保存する必要があります。変更したい。

参考までに、この手法はuser.moduleのコアによって実装されます( ser_menu_link_alter および ser_translated_menu_link_alter を参照)および menu_token モジュールによって実装されます。

11
jonhattan

Internationalization モジュールをインストールすると、メニュー構成ページで言語を選択できます(例:admin/structure/menu/manage/main-menu/add)。言語を選択し、言語のそれぞれのパスを設定します。

2つの言語がある場合は、言語ごとに2つのメニュー項目を作成する必要があります。次に、言語を選択すると、それぞれの言語のメニュー項目が表示されます。

5
Sithu

数日かけて頭をぶち壊した後、私はようやく自分の問題を解決する方法を見つけました!!!

したがって、少し要約します。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;
        }
    }
}

これが意味をなさない場合は、遠慮なく私に尋ねてください。私はそれを自分でほとんど理解できませんが、トリックを行います!

0
Smos