Bagaimana saya bisa membuat tampilan simpul anak berdasarkan hubungan menu?

17

Katakanlah Anda memiliki halaman berikut dalam susunan menu:

  • Proyek
    • Proyek Satu
    • Proyek Dua
    • Proyek Tiga

Saya mencari cara untuk membuat tampilan yang akan disematkan di halaman Proyek (induk) yang akan menampilkan gambar, judul, dan teks (ringkasan) dari halaman anak.

Hubungan antara orang tua dan anak-anak didefinisikan dalam susunan menu.

Saya tahu saya bisa menggunakan referensi simpul, tetapi itu berarti setiap kali seseorang membuat halaman mereka harus mendefinisikan hubungan menu dan kemudian hubungan referensi simpul.

Saya juga tahu bahwa saya bisa membuat tipe konten lain tapi saya pikir ini berlebihan karena semua halaman konten terlihat sama.

Camsoft
sumber
1
Tidak ada hubungan langsung antara node yang ditampilkan dalam submenu node lain (Satu-satunya koneksi antara link menu dan node adalah bahwa link menu menunjuk ke node / nid). Jadi Anda perlu sesuatu untuk menghubungkan sub-node ini bersama-sama (dan ke node-induk), bisa menjadi istilah taksonomi yang umum, book.module, ...
Berdir

Jawaban:

4

Salah satu solusinya adalah dengan menggunakan istilah taksonomi untuk mendefinisikan hubungan dan kemudian menggunakan modul Menu Taksonomi untuk menerjemahkan hubungan istilah tersebut ke dalam item menu. Anda kemudian dapat menggunakan modul Halaman Kustom dan modul Konteks untuk mengontrol informasi dan wilayah di semua halaman jika Anda tidak ingin menggunakan panel.

Adam S
sumber
16

Anda dapat melakukan ini dengan menggunakan Menu Node API dan modul Menu Node Views .

Buat tampilan dengan jenis konten yang diperlukan, dan pilih filter kontekstual "Menu: ID tautan menu" (ini hanya tersedia dengan modul-modul di atas terpasang).

Di bawah, "Ketika nilai filter tidak tersedia," pilih "Berikan nilai default" dan pilih "kode PHP."

Cuplikan berikut akan melakukannya, lalu Anda cukup memperlihatkan blok dari tampilan dan Anda ada di sana:

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;
      }  
   }
}
Emile Kott
sumber
3
Saya pikir filter harus "Menu: Parent menu link id" untuk mengambil anak-anak dari node saat ini. Dan kode argumen dapat berupa: $ current = end (menu_get_active_trail ()); return $ current ['mlid'];
Stefan
Terima kasih untuk ini. Beberapa perbaikan (selain koreksi @ Stefan). 1) Anda dapat menggunakan menu_load_object(arg(1))alih-alih node_load()untuk menghemat biaya. 2) Anda harus memeriksa untuk memastikan bahwa item menu dari menu yang Anda khawatirkan. Saat ini, Anda baru saja mengembalikan yang pertama $mlid. Di dalam foreach Anda harus menambahkan sebuah kondisional if ($data->menu_name == 'my-menu')untuk memperbaikinya. dan 3) Anda mungkin ingin menambahkan filter kedua untuk menu: hiddenhanya mengembalikan item yang tidak disembunyikan. Gunakan potongan yang sama, tetapi kembalikan $data->hidden;bukan $mlid.
Adam Balsam
2
Saya akan sangat menyarankan modul yang masih dalam tahap pengembangan.
Ambidex
@Stefan ada jauh untuk mendapatkan semua anak di tingkat mana pun? bukan hanya yang pertama.
Eli Stone
4

The Node Hierarchy Modul memungkinkan jenis hubungan, serta menyediakan integrasi pandangan.

Hirarki Node memungkinkan node menjadi anak-anak dari node lain yang membuat hierarki konten seperti pohon. Modul ini menawarkan:

  • 1-Klik pembuatan menu hierarkis
  • Remah roti hirarkis
  • URL hierarkis otomatis menggunakan Pathauto (dan modul token)

    (misalnya: q = aboutus / sejarah / awal).

  • Pembuatan menu hierarkis secara otomatis jika diinginkan.
  • Integrasi Tampilan Opsional.
  • Integrasi Akses Node Opsional.
CCMonkey
sumber
2

Mungkin ini telah berubah untuk D7 / Views 3, tetapi Anda tidak memerlukan PHP apa pun untuk mencapai perilaku yang diinginkan:

  1. instal modul menu_views , menu_node dan menu_node_views .
  2. buat tampilan baru jenis "pohon menu"
  3. tambahkan bidang "Menu: judul tautan" dan "Menu: deskripsi"
  4. Tambahkan Filter / Argumen Kontekstual "Menu: Node ID"; Berikan nilai default "ID Konten dari URL"
  5. Tambahkan Hubungan "Menu: ID tautan menu induk"

voila. Ini tidak harus bekerja , tetapi tidak.

Ini berfungsi dengan baik hanya dengan node, tetapi keuntungan menggunakan tautan menu melalui hierarki node adalah Anda tidak terbatas untuk membangun navigasi di sekitar node. Anda bahkan dapat memasukkan tautan eksternal dalam tampilan Anda.

aaronbauman
sumber
Ini adalah opsi yang baik untuk mengekspos tautan simpul (dan saya suka Aaron Bauman memasang tampilan sampel ini untuk diimpor: pastebin.com/u2GjmWG7 ). Namun, saya mengalami beberapa kesulitan membuat bidang simpul tersedia untuk dilihat, karena OP meminta. Bagaimana itu dicapai?
doub1ejack
Anda harus dapat mengekspos bidang simpul dengan menambahkan hubungan ke "Menu: Node ID." Apakah Anda melihat sesuatu seperti itu?
aaronbauman
2

Ada modul Tampilan Menu Node Children Filter yang relatif baru yang tampaknya melakukan apa yang Anda inginkan:

Modul ini menambahkan filter kontekstual ke Views yang akan mengambil simpul anak simpul sesuai dengan struktur menu.

nwellnhof
sumber
0

Sudahkah Anda mempertimbangkan untuk menggunakan Referensi Node untuk tujuan ini?

  1. Berikan bidang referensi simpul ke tipe konten yang ingin Anda tampilkan.
  2. Gunakan bidang itu sebagai filter kontekstual di Tampilan (nilai default: ID Konten dari url ).
  3. Tambahkan tampilan tampilan ini sebagai blok ke konten. Node yang sedang ditampilkan akan dilihat sebagai induk dari node yang merujuknya misalnya.

Dengan demikian Anda dapat mencapai hasil yang sama seperti yang mungkin Anda cari.

cptstarling
sumber
0

Jawaban dari Emile benar, tetapi saya harus menempelkan kode PHP yang disebutkan dalam filter kontekstual dengan jenis " Menu: Id tautan menu induk ".

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;
      }  
   }
}
cptstarling
sumber
0

Jika Anda menggunakan terjemahan entitas dan simpul dilampirkan ke menu yang berbeda, berikut adalah adaptasi dari kode yang memfilter pada bahasa saat ini. Anda perlu menyalin ini sebagai kode PHP untuk filter kontekstual (id tautan menu induk) dalam tampilan Anda seperti dijelaskan dalam jawaban lain

 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);
    }
  }
}
  }
bendev
sumber
0

Dari antrian masalah dari menu Node Views kami memiliki solusi ini bagus:

  • tambahkan filter kontekstual dengan 'ID tautan menu induk',
  • pilih 'Berikan nilai default'
  • pilih 'kode php khusus'
  • masukkan kode berikut

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