web-dev-qa-db-ja.com

メニュー関係に基づいて子ノードのビューを作成するにはどうすればよいですか?

メニューツリーに次のページがあるとします。

  • プロジェクト
    • プロジェクトワン
    • プロジェクト2
    • プロジェクト3

子ページの写真、タイトル、テキスト(概要)を表示するプロジェクト(親)ページに埋め込まれるビューを作成する方法を探しています。

親と子の関係は、メニューツリーで定義されます。

ノード参照を使用できることはわかっていますが、誰かがページを作成するたびに、メニュー関係を定義してからノード参照関係を定義する必要があります。

また、別のコンテンツタイプを作成できることも知っていますが、すべてのコンテンツページが同じように見えるため、これはやり過ぎだと思います。

17
Camsoft

1つの解決策は、分類用語を使用して関係を定義し、次に Taxonomy Menu module を使用してそれらの用語の関係をメニュー項目に変換することです。パネルを使用しない場合は、 カスタムページモジュール およびコンテキストモジュールを使用して、すべてのページの情報と領域を制御できます。

4
Adam S

Menu Node API および Menu Node Views モジュールを使用して、これを正確に行うことができます。

必要なコンテンツタイプでビューを作成し、「メニュー:メニューリンクID」のコンテキストフィルターを選択します(これは、上記のモジュールがインストールされている場合にのみ使用できます)。

「フィルター値が使用できない場合」の下で、「デフォルト値を提供」を選択し、「PHPコード」を選択します。

次のスニペットがそれを実行し、ビューからブロックを公開するだけで、そこにいます。

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
16
Emile Kott

ノード階層モジュール は、このタイプの関係を可能にするだけでなく、ビュー統合を提供します。

ノード階層を使用すると、ノードを他のノードの子にして、コンテンツのツリー状の階層を作成できます。モジュールは以下を提供します:

  • ワンクリックで階層メニューを作成
  • 階層的なパンくずリスト
  • Pathauto(およびトークンモジュール)を使用した自動階層URL

    (例:q = aboutus/history/beginning)。

  • 必要に応じて、階層メニューの自動作成。
  • オプションのビュー統合。
  • オプションNodeアクセス統合。
4
CCMonkey

多分これはD7/Views 3で変更されましたが、必要な動作を実現するためにPHPは必要ありません。

  1. インストール menu_viewsmenu_node および menu_node_views モジュール。
  2. タイプ「メニューツリー」の新しいビューを作成する
  3. 「メニュー:リンクのタイトル」と「メニュー:説明」のフィールドを追加
  4. コンテキストフィルター/引数「メニュー:Node ID」を追加;デフォルト値「URLからのコンテンツID」を提供
  5. 関係「メニュー:親メニューのリンクID」を追加します

出来上がり。 機能しないはずです ですが、機能します。

ノードだけでも問題なく機能しますが、ノード階層よりもメニューリンクを使用する利点は、ノードの周囲にナビゲーションを構築することに限定されないことです。ビューに外部リンクを含めることもできます。

2
aaronbauman

比較的新しいモジュールがあります Views Menu Node Children Filter これはまさにあなたが望むことをするようです:

このモジュールは、メニューの構造に従ってノードの子ノードを取得するビューにコンテキストフィルターを追加します。

2
nwellnhof

エンティティの翻訳を使用し、ノードが別のメニューに接続されている場合、現在の言語でフィルターするコードを以下に示します。他の回答で説明されているように、ビューにPHPコンテキストフィルターのコード(親メニューリンクID))としてこれをコピーする必要があります

 if (function_exists('menu_node_get_links')) {
global $language;
$lang = $language->language;
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)) {
  foreach ($node->menu_node_links as $mlid => $data) {  
    if ($lang == $data->language) {
      return($mlid);
    }
  }
}
  }
0
bendev

Emile からの答えは正しいですが、言及されたPHPコードをのコンテキストフィルターMenu:親メニューリンクID」と入力します。

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
0
cptstarling

この目的で Node Reference の使用を検討しましたか?

  1. 表示するコンテンツタイプへのノード参照フィールドを提供します。
  2. そのフィールドをビューのコンテキストフィルターとして使用します(デフォルト値:URLからのコンテンツID)。
  3. このビュー表示をブロックとしてコンテンツに追加します。それが表示されているノードは、たとえばそれを参照するノードの親として表示されます。

したがって、おそらく探しているのと同じような結果を得ることができます。

0
cptstarling

issue queueMenu Node Views から、この素敵なソリューションがあります:

  • 「親メニューのリンクID」を使用してコンテキストフィルターを追加します。
  • 「デフォルト値を提供」を選択します
  • 「カスタムphpコード」を選択します
  • 次のコードを入力してください

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
    
0
tostinni