ฉันจะสร้างมุมมองของชายด์โหนดตามความสัมพันธ์เมนูได้อย่างไร?


17

สมมติว่าคุณมีหน้าต่อไปนี้ในแผนผังเมนู:

  • โครงการ
    • โครงการหนึ่ง
    • โครงการสอง
    • โครงการที่สาม

ฉันกำลังมองหาวิธีสร้างมุมมองที่จะฝังอยู่ในหน้าโครงการ (หลัก) ที่จะแสดงรูปภาพชื่อและข้อความ (สรุป) จากหน้าย่อย

ความสัมพันธ์ระหว่างพาเรนต์และลูกถูกกำหนดในแผนผังเมนู

ฉันรู้ว่าฉันสามารถใช้การอ้างอิงโหนด แต่นั่นหมายความว่าทุกครั้งที่มีคนสร้างเพจพวกเขาจะต้องกำหนดความสัมพันธ์ของเมนูและจากนั้นความสัมพันธ์การอ้างอิงโหนด

นอกจากนี้ฉันรู้ว่าฉันสามารถสร้างประเภทเนื้อหาอื่นได้ แต่ฉันคิดว่ามันเกินความจริงเนื่องจากหน้าเนื้อหาทั้งหมดมีลักษณะเหมือนกัน


1
ไม่มีความสัมพันธ์โดยตรงระหว่างโหนดที่แสดงในเมนูย่อยของโหนดอื่น (การเชื่อมต่อเพียงอย่างเดียวระหว่างลิงค์เมนูและโหนดคือเมนูลิงค์ชี้ไปที่โหนด / nid) ดังนั้นคุณต้องมีบางสิ่งบางอย่างในการเชื่อมโยงโหนดย่อยเหล่านี้เข้าด้วยกัน (และกับ parent-node) อาจเป็นคำศัพท์อนุกรมวิธานทั่วไป book.module, ...
Berdir

คำตอบ:


4

ทางออกหนึ่งคือการใช้คำศัพท์อนุกรมวิธานเพื่อกำหนดความสัมพันธ์และจากนั้นใช้โมดูลเมนู Taxonomyเพื่อแปลความสัมพันธ์ของคำเหล่านั้นเป็นรายการเมนู จากนั้นคุณสามารถใช้โมดูลหน้ากำหนดเองและโมดูลบริบทเพื่อควบคุมข้อมูลและภูมิภาคในทุกหน้าหากคุณไม่ต้องการใช้แผงควบคุม


16

คุณสามารถทำสิ่งนี้ได้อย่างแน่นอนโดยใช้เมนูโหนดโหนด และโมดูลเมนูมุมมองโหนด

สร้างมุมมองด้วยประเภทเนื้อหาที่คุณต้องการและเลือกตัวกรองตามบริบทของ "เมนู: รหัสลิงก์เมนู" (ใช้ได้เฉพาะกับโมดูลที่ติดตั้งข้างต้น)

ภายใต้ "เมื่อค่าตัวกรองไม่พร้อมใช้งาน" เลือก "ระบุค่าเริ่มต้น" และเลือก "รหัส 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
ฉันคิดว่าตัวกรองควรเป็น "เมนู: ลิงค์เมนูหลัก" เพื่อใช้พา ธ ของโหนดปัจจุบัน และรหัสอาร์กิวเมนต์สามารถเป็น: $ current = end (menu_get_active_trail ()); ส่งคืน $ ปัจจุบัน ['mlid'];
สเตฟาน

ขอบคุณสำหรับสิ่งนี้. การปรับปรุงเล็กน้อย (นอกเหนือจากการแก้ไขของ @ Stefan) 1) คุณสามารถใช้menu_load_object(arg(1))แทนnode_load()การประหยัดค่าใช้จ่าย 2) คุณควรตรวจสอบเพื่อให้แน่ใจว่ารายการเมนูนั้นมาจากเมนูที่คุณเกี่ยวข้อง $mlidตอนนี้คุณก็จะกลับมาเป็นครั้งแรก ข้างหน้าคุณควรเพิ่มเงื่อนไขif ($data->menu_name == 'my-menu')เพื่อแก้ไขปัญหานี้ และ 3) คุณอาจต้องการเพิ่มตัวกรองที่สองmenu: hiddenเพื่อส่งคืนเฉพาะรายการที่ไม่ได้ซ่อนไว้ ใช้ข้อมูลโค้ดเดียวกัน แต่กลับแทน$data->hidden; $mlid
Adam Balsam

2
ฉันขอแนะนำอย่างยิ่งให้แนะนำโมดูลที่ยังอยู่ในช่วงการพัฒนา
Ambidex

@Stefan อยู่ที่นั่นเพื่อให้เด็กทุกคนในระดับใด? แทนที่จะเป็นคนแรก
Eli Stone

4

โหนดลำดับชั้นโมดูลอนุญาตประเภทนี้ของความสัมพันธ์เช่นเดียวกับการให้บูรณาการมุมมอง

Node Hierarchy อนุญาตให้โหนดเป็นโหนดย่อยของโหนดอื่นที่สร้างลำดับชั้นเหมือนต้นไม้ของเนื้อหา ข้อเสนอโมดูล:

  • 1- คลิกสร้างเมนูลำดับชั้น
  • เกล็ดขนมปัง
  • URL ลำดับขั้นอัตโนมัติโดยใช้ Pathauto (และโมดูลโทเค็น)

    (เช่น: q = aboutus / history / start)

  • การสร้างเมนูลำดับชั้นโดยอัตโนมัติหากต้องการ
  • การรวม Views ที่เป็นทางเลือก
  • การรวม Node Access เสริม

2

อาจมีการเปลี่ยนแปลงสำหรับ D7 / Views 3 แต่คุณไม่ต้องการ PHP ใด ๆ เพื่อให้ได้ตามที่ต้องการ:

  1. ติดตั้งmenu_views , menu_nodeและmenu_node_viewsโมดูล
  2. สร้างมุมมองใหม่ของประเภท "เมนูทรี"
  3. เพิ่มช่อง "เมนู: ลิงค์ชื่อ" และ "เมนู: คำอธิบาย"
  4. เพิ่มตัวกรองบริบท / อาร์กิวเมนต์ "เมนู: รหัสโหนด"; ระบุค่าเริ่มต้น "Content ID จาก URL"
  5. เพิ่มความสัมพันธ์ "เมนู: ลิงก์เมนูหลัก"

voila มันไม่ควรทำงานแต่ทำ

มันใช้งานได้ดีกับโหนดเพียงอย่างเดียว แต่ข้อดีของการใช้ลิงก์เมนูผ่านลำดับชั้นของโหนดคือคุณไม่ได้ถูก จำกัด การสร้างการนำทางรอบ ๆ โหนด คุณสามารถรวมลิงก์ภายนอกไว้ในมุมมองของคุณ


นี่เป็นตัวเลือกที่ดีสำหรับการเปิดเผยลิงก์ของโหนด (และฉันชอบที่ Aaron Bauman ใส่มุมมองตัวอย่างนี้เพื่อนำเข้า: pastebin.com/u2GjmWG7 ) อย่างไรก็ตามฉันมีปัญหาในการทำให้เขตข้อมูลโหนดพร้อมใช้งานสำหรับมุมมองเนื่องจาก OP กำลังร้องขอ สำเร็จได้อย่างไร
doub1ejack

คุณควรจะสามารถเปิดเผยฟิลด์ของโหนดโดยการเพิ่มความสัมพันธ์ใน "เมนู: Node ID" คุณเห็นอะไรแบบนั้นไหม?
aaronbauman

2

มีโมดูลตัวกรองโหนดเมนูเด็กที่ค่อนข้างใหม่ที่ดูเหมือนจะทำสิ่งที่คุณต้องการ:

โมดูลนี้เพิ่มตัวกรองเชิงบริบทให้กับ Views ที่จะดึงโหนดชายด์ของโหนดตามโครงสร้างของเมนู


0

คุณได้พิจารณาใช้การอ้างอิงโหนดเพื่อจุดประสงค์นี้หรือไม่?

  1. ระบุฟิลด์การอ้างอิงโหนดให้กับชนิดเนื้อหาที่คุณต้องการแสดง
  2. ใช้ฟิลด์นั้นเป็นตัวกรองเชิงบริบทในมุมมอง (ค่าเริ่มต้น: Content ID from url )
  3. เพิ่มมุมมองนี้แสดงเป็นบล็อกให้กับเนื้อหา โหนดที่มันถูกแสดงจะถูกมองว่าเป็นพาเรนต์ของโหนดที่อ้างอิงถึงมันเป็นต้น

ดังนั้นคุณสามารถบรรลุผลลัพธ์ที่คล้ายกันตามที่คุณต้องการ


0

คำตอบจากEmileนั้นถูกต้อง แต่ฉันต้องวางโค้ด PHP ที่ถูกกล่าวถึงในตัวกรองตามบริบทของประเภท " เมนู: เมนูลิงค์ 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

หากคุณใช้การแปลเอนทิตีและโหนดเชื่อมต่อกับเมนูอื่น ๆ นี่คือการปรับเปลี่ยนของรหัสที่กรองในภาษาปัจจุบัน คุณต้องคัดลอกนี่เป็นรหัส 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

จากคิวปัญหาของมุมมองเมนูโหนดเรามีวิธีแก้ปัญหาที่ดีนี้:

  • เพิ่มตัวกรองตามบริบทด้วย '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.