web-dev-qa-db-ja.com

コンテンツを追加する際の言語固有のメニュー項目

英語とフランス語のバイリンガルサイトを構築しています。英語でコンテンツアイテムを追加し、[メニュー設定]に移動して、[メニューリンクを提供]をクリックし、[親アイテム]ドロップダウンメニューをクリックすると、allメニューアイテムの英語とフランス語が表示されます。コンテンツが英語の場合、ドロップダウンメニュー項目に英語のメニュー項目のみを表示するにはどうすればよいですか?

2
John

誰も答えてくれなかったので、コアを変更することにしました。これは完全に哀れです。コアをハッキングする際に、class="en"またはclass="fr"を選択メニューのオプションに追加します。これで、jqueryを使用して、必要に応じてオプションの表示と非表示を切り替えることができます。これが、コアシステムに加えた変更のgit diffです。

diff --git a/includes/form.inc b/includes/form.inc
index a337b03..55f705f 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -2564,7 +2564,14 @@ function form_select_options($element, $choices = NULL) {
       else {
         $selected = '';
       }
-      $options .= '<option value="' . check_plain($key) . '"' . $selected . '>' . check_plain($choice) . '</option>';
+       $choice_text = check_plain($choice);
+       $class=' class="opt"';
+       if(preg_match('/\{\{\w{2}\}\}/',$choice_text,$matches))
+       {
+               $class = ' class="'.preg_replace('/[^\w]/','',$matches[0]).'"';
+               $choice_text = preg_replace('/\s\{\{\w{2}\}\}/','',$choice_text);
+       }
+      $options .= '<option value="' . check_plain($key) . '"' . $selected . $class.'>' . $choice_text . '</option>';
     }
   }
   return $options;
diff --git a/modules/menu/menu.module b/modules/menu/menu.module
index fc8f68a..b991970 100644
--- a/modules/menu/menu.module
+++ b/modules/menu/menu.module
@@ -408,7 +408,7 @@ function _menu_parents_recurse($tree, $menu_name, $indent, &$options, $exclude,
       if ($data['link']['hidden']) {
         $title .= ' (' . t('disabled') . ')';
       }
-      $options[$menu_name . ':' . $data['link']['mlid']] = $title;
+      $options[$menu_name . ':' . $data['link']['mlid']] = $title.' {{'.$data['link']['language'].'}}';
       if ($data['below']) {
         _menu_parents_recurse($data['below'], $menu_name, $indent . '--', $options, $exclude, $depth_limit);
       }
diff --git a/themes/seven/seven.info b/themes/seven/seven.info
index 599879f..b625854 100644
--- a/themes/seven/seven.info
+++ b/themes/seven/seven.info
@@ -12,6 +12,7 @@ regions[page_top] = Page top
 regions[page_bottom] = Page bottom
 regions[sidebar_first] = First sidebar
 regions_hidden[] = sidebar_first
+scripts[] = lang.js

 ; Information added by drupal.org packaging script on 2011-05-25
 version = "7.2"

また、オプションを適切な言語に切り替える/themes/seven/lang.jsというjsファイルを追加しました。

if (typeof jQuery == 'function'){
  jQuery(document).ready(function($) {
        $('#edit-language').change(function(){
                if($(this).val() != 'und')
                {
                        $('#edit-menu-parent option').css('display','none');
                        $('#edit-menu-parent .'+$(this).val()+', #edit-menu-parent .opt').css('display','block');
                }
        });
  });
}

この回答と同じ目的を達成するためのより良い方法を提案してください。

1
John

私の経験では、ユーザー1(管理者)は言語設定に関係なくすべてのメニュー項目を表示しますが、それが意図されたものなのか、バグなのかはわかりません。

I18nの問題 、特に Drupal 7&i18n:メニュー設定/親メニュー項目に現在表示されている言語項目のみ をよく見てください==

3
Attiks

問題に取り組んだ後の私の解決策は:

  • 有効-> 多言語選択(モジュール)
  • 移動:admin/config/regional/i18n/select
  • 言語でノードを選択してください
1
Oren Roth

Drupalの hook_form_alter を使用して、ユーザーの言語またはニュートラルでないアイテムをフィルターで除外できると思います。

これは次のようなものです。

function hook_form_alter(&$form, &$form_state, $form_id) {
    global $user;

    foreach ($form['menu']['link']['parent']['#options'] as $key => $option) {
        $keyArray = explode(':', $key);
        $mid = $keyArray[1];
        $node = menu_node_get_node($mid);

        if ($node && ($node->language !== $user->language && $node->language !== 'und')) {
            unset($form['menu']['link']['parent']['#options'][$key]);
        }
    }
}

ひどく遅い答えですが、おそらく今日のGoogleでこれを見つけた人々に関連しています。

0
Novas