メニューツリーに次のページがあるとします。
子ページの写真、タイトル、テキスト(概要)を表示するプロジェクト(親)ページに埋め込まれるビューを作成する方法を探しています。
親と子の関係は、メニューツリーで定義されます。
ノード参照を使用できることはわかっていますが、誰かがページを作成するたびに、メニュー関係を定義してからノード参照関係を定義する必要があります。
また、別のコンテンツタイプを作成できることも知っていますが、すべてのコンテンツページが同じように見えるため、これはやり過ぎだと思います。
1つの解決策は、分類用語を使用して関係を定義し、次に Taxonomy Menu module を使用してそれらの用語の関係をメニュー項目に変換することです。パネルを使用しない場合は、 カスタムページモジュール およびコンテキストモジュールを使用して、すべてのページの情報と領域を制御できます。
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;
}
}
}
ノード階層モジュール は、このタイプの関係を可能にするだけでなく、ビュー統合を提供します。
ノード階層を使用すると、ノードを他のノードの子にして、コンテンツのツリー状の階層を作成できます。モジュールは以下を提供します:
- ワンクリックで階層メニューを作成
- 階層的なパンくずリスト
Pathauto(およびトークンモジュール)を使用した自動階層URL
(例:q = aboutus/history/beginning)。
- 必要に応じて、階層メニューの自動作成。
- オプションのビュー統合。
- オプションNodeアクセス統合。
多分これはD7/Views 3で変更されましたが、必要な動作を実現するためにPHPは必要ありません。
出来上がり。 機能しないはずです ですが、機能します。
ノードだけでも問題なく機能しますが、ノード階層よりもメニューリンクを使用する利点は、ノードの周囲にナビゲーションを構築することに限定されないことです。ビューに外部リンクを含めることもできます。
比較的新しいモジュールがあります Views Menu Node Children Filter これはまさにあなたが望むことをするようです:
このモジュールは、メニューの構造に従ってノードの子ノードを取得するビューにコンテキストフィルターを追加します。
エンティティの翻訳を使用し、ノードが別のメニューに接続されている場合、現在の言語でフィルターするコードを以下に示します。他の回答で説明されているように、ビューに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);
}
}
}
}
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;
}
}
}
この目的で Node Reference の使用を検討しましたか?
したがって、おそらく探しているのと同じような結果を得ることができます。
issue queueMenu Node Views から、この素敵なソリューションがあります:
次のコードを入力してください
$menu_item = menu_get_active_trail();
$current_item = array_pop($menu_item);
$menu_item_plid = $current_item['plid'];
return $menu_item_plid;