web-dev-qa-db-ja.com

分類メニューを標準メニュー項目のサブメニューとして挿入するにはどうすればよいですか?

次のようなトップレベルの構造を持つメインメニューがあります。

Home - Categories - Something Else - ... - Contact

これらのトップレベルのリンクはそれぞれ、適切なノードページに移動します。

カテゴリー(マルチレベル)のボキャブラリーがあり、「カテゴリー」項目の下のサブメニューでそれらの分類用語を取得する必要があります。サブメニューはボキャブラリーのように拡大/縮小されるため、アイテムをメインメニューにハードコーディングすることは避けたいです。

これまでに、これを達成するために過度に精巧なコードを記述しました。これは、分類操作にフックし、それに基づいて特定のメニューのサブアイテムを管理します( Taxonomy Men と同様ですが、語彙ごとに異なるメニューを用意します)。

その方法は機能しますが、理想的ではなく、一般的でもありません。そのコードを古いプロジェクトから新しいプロジェクトに単純に持ち上げることはできません。妥当な量のカスタマイズが必要になります。

これに対する「標準」のモジュールベースのソリューションが必要だと感じずにはいられません。

いくつかの異なるモジュールを組み合わせて使用​​するための提案をいくつか見ました(奇妙なことに、ビューベースのモジュールを使用することを提案するものもあります)。私はどんな提案にも心を開いていますが、1つまたは2つ以上のモジュールのインストール、およびハードコーディングされたコンテキスト固有の構成のロードが含まれる場合、おそらくこの場合はあまり役に立ちません。

12
Clive

オプションa)誤解しない限り、作成するときに分類メニューの親になる場所(メニューの場所)を選択することはできませんか?あなたがこれで得るかもしれないと思う唯一の問題は私ですthink分類が更新されるたびにメニューを再構築する必要があります

オプションb)私は自分のサイトでこれにかなり類似した何かを行いました。私は Menu Views モジュールを使用して、ビューをプライマリメニューに配置できるようにしました。

すべての分類用語を一覧表示する新しいビューをブロック表示として作成する場合は、必要に応じてビューに追加のフィルター処理/変更を適用します(私の例ではそうではないかもしれませんが)。その後、メインメニューに新しいリンクを追加するときに、リンクではなくビューを使用するように選択できます。そこから、使用するビューを選択し、「カテゴリ」メニュー項目を親として選択して保存します(保存後、メニューでそれを有効にする必要があります。これはモジュール自体のバグのようです)

これがあなたにとって最良のソリューションであることを保証することはできませんが、テストしただけではうまくいきました

13
Andrew Morris

Menupoly には、カスタムの「メニューツリーソース」用のAPIがあります。メニューリンク以外にこれを実際に使用したことがないので、途中で修正しなければならない問題があるかもしれません。しかし、基本的なアーキテクチャはそこにあります。

このルートに行くと、

  • 「Categories」ページ以外の分類用語のリンクなしで、既存のメインメニューを使用します。
  • それとは別に分類ツリーを作成します。
  • 通常どおりmenu_linksからフェッチするカスタムの「メニューツリーソース」を記述しますが、分類用語が見つかると、代わりに分類からフェッチします。
    したがって、「カテゴリ」リンクが分類に関連していることを何らかの方法で検出できるようにする必要があります。
  • メニューリンクが分類に関連していて、同時に通常のサブメニューがある場合は、2つのタイプの子をどうにかして組み合わせる必要があります。

このルートは多少の作業になりますが、他のユーザーに役立つ場合があり、おそらくサイト固有のロジックよりもエレガントで再利用可能です。

現在、分類法のみの「メニューツリーソース」も存在しないため、混合プラグインを開始する前の最初のステップとして妥当な場合があります。

3
donquixote

私は最近、製品カテゴリメニューに対して同様のことを行いました。これは深さ1レベルのみでしたが、さらにレベルを表示するように簡単に変更できました。

/**
 * Implements theme_menu_link().
 */
function THEME_menu_link__main_menu($variables) {

  $sub_menu = '';
  $element = $variables['element'];
  $menu_string = $element['#title'];

  if (module_load_include('inc','pathauto','pathauto') !== FALSE) {
    $menu_string =  pathauto_cleanstring($menu_string);
  }

  if ($menu_string == 'categories') {
    $sub_menu = get_categories_menu();
  }

  if ($sub_menu) {
    $element['#attributes']['class'][] = 'haschildren';
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

function get_categories_menu() {

  $current_category = arg(2); // Get current category from path
  $volcab = taxonomy_vocabulary_machine_name_load('product-categories');
  $tree = taxonomy_get_tree($volcab->vid,0,1);

  $output = '<ul class="menu product-category">';
  foreach ($tree as $term) {
    $safe_term = pathauto_cleanstring($term->name);
    $class = ($current_category==$safe_term) ? ' class="active"' : '';
    $output .= '<li><a' . $class . ' href="/path/to/' . $safe_term . '">' . $term->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}

Get_category_menu関数の方がブロックとして適していますが、ここでは、便宜上、template.phpの別の関数として示しています。

それが役立つか、少なくとも解決策へのステップであることを願っています。

ポール

2
paul.linney

Metro Menus は要件を実行し、組み込みのスキンがあり、ニースメニューのように動作する独自のスキンを作成できます。このモジュールを使用すると、サブ項目を選択できますメニューまたは分類法から任意の深さ -)そして私は以前これを使っていません。

タッチスクリーン(iPad、iPhoneなど)との互換性。

enter image description here

2
Bala

同じように Om Maxiメニュー モジュールを使用できます。管理者は、添付ファイルとして必要なブロックを含むメニュー、ビュー、スライドショー、メニュー、ユーザー、ニースメニュー、クイックタブ、テーブル、リスト、画像、動画などのカスタムブロックを作成できます。

Taxonomy Men を使用して別のメニューを作成し、このメニューをom maxiメニューによって生成されたメニューへのサブリンクとして添付できます。

ありがとう

2