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


17

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

  • プロジェクト
    • プロジェクト1
    • プロジェクト2
    • プロジェクト3

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

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

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

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


1
別のノードのサブメニューに表示されるノード間の直接の関係はありません(メニューリンクとノード間の唯一の接続は、メニューリンクがnode / nidを指すことです)。あなたは(と親ノードに)一緒にこれらのサブノードをリンクする何かを必要とするので、一般的な分類用語、book.module、...かもしれない
Berdir

回答:


4

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


16

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

3
現在のノードの子を取得するために、フィルターは「Menu:Parent menu link id」である必要があると思います。引数コードは次のようになります:$ current = end(menu_get_active_trail()); return $ current ['mlid'];
ステファン

これをありがとう。いくつかの改善(@Stefanの修正に加えて)。1)menu_load_object(arg(1))代わりにnode_load()を使用して、費用を節約できます。2)メニュー項目が関心のあるメニューからのものであることを確認する必要があります。今、あなたは最初のものを返しているだけです$mlid。foreach内に、if ($data->menu_name == 'my-menu')これを修正するための条件を追加する必要があります。3)2番目のフィルターを追加して、menu: hidden非表示ではないアイテムのみを返すことができます。同じスニペットを使用しますが、$data->hidden;ではなくを返し$mlidます。
アダムバルサム

2
まだ開発段階にあるモジュールを提案することは強くお勧めしません。
アンビデックス14年

@Stefanは、あらゆるレベルのすべての子供を取得するためにそこにいますか?最初の代わりに。
エリストーン

4

ノード階層モジュールは、この関係の種類だけでなく、ビューの統合を提供することができます。

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

  • 階層メニューのワンクリック作成
  • 階層ブレッドクラム
  • Pathauto(およびトークンモジュール)を使用した自動階層URL

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

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

2

D7 / Views 3ではこれが変更された可能性がありますが、目的の動作を実現するためにPHPは必要ありません。

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

出来上がり。それは動作しないはずですが、それはありません。

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


これは、ノードリンクを公開するための適切なオプションです(そして、Aaron Baumanがこのサンプルビューをインポートするために貼り付けているのが大好きです:pastebin.com/u2GjmWG7)。ただし、OPが要求しているため、ビューでノードフィールドを使用できるようにするのに問題がありました。それはどのように達成されますか?
doub1ejack

「メニュー:ノードID」に関係を追加することにより、ノードフィールドを公開できるはずです。そのようなものを見ますか?
アーロンバウマン


0

この目的でノードリファレンスを使用することを検討しましたか?

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

したがって、おそらく探しているのと同様の結果を達成できます。


0

Emileからの答えは正しいのですが、言及されたPHPコードを「Menu:Parent menu link 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

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

 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

発行キューメニューノードビュー我々は、この素敵な解決策を持っています:

  • 「Parent menu link id」のコンテキストフィルターを追加します。
  • 「デフォルト値を提供する」を選択します
  • 「カスタムphpコード」を選択します
  • 次のコードを入力してください

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.