Làm cách nào tôi có thể tạo chế độ xem các nút con dựa trên mối quan hệ menu?


17

Giả sử bạn có các trang sau trong cây menu:

  • Dự án
    • Dự án một
    • Dự án hai
    • Dự án ba

Tôi đang tìm cách tạo chế độ xem sẽ được nhúng trong trang Dự án (cha mẹ) sẽ hiển thị ảnh, tiêu đề và văn bản (tóm tắt) từ các trang con.

Mối quan hệ giữa cha mẹ và con cái được xác định trong cây menu.

Tôi biết tôi có thể sử dụng tham chiếu nút, nhưng điều đó có nghĩa là mỗi khi ai đó tạo một trang họ sẽ phải xác định mối quan hệ menu và sau đó là mối quan hệ tham chiếu nút.

Ngoài ra tôi biết rằng tôi có thể tạo một loại nội dung khác nhưng tôi nghĩ rằng điều này là quá mức cần thiết vì tất cả các trang nội dung trông giống nhau.


1
Không có mối quan hệ trực tiếp giữa các nút được hiển thị trong menu con của nút khác (Kết nối duy nhất giữa liên kết menu và nút là liên kết menu trỏ đến nút / nid). Vì vậy, bạn cần một cái gì đó để liên kết các nút phụ này với nhau (và với nút cha), có thể là một thuật ngữ phân loại phổ biến, book.module, ...
Berdir

Câu trả lời:


4

Một giải pháp là sử dụng thuật ngữ phân loại để xác định các mối quan hệ và sau đó sử dụng mô-đun Menu phân loại để dịch các mối quan hệ thuật ngữ đó thành các mục menu. Sau đó, bạn có thể sử dụng mô-đun Trang tùy chỉnh và mô-đun Bối cảnh để kiểm soát thông tin và khu vực trên tất cả các trang nếu bạn không muốn sử dụng bảng.


16

Bạn có thể thực hiện chính xác điều này bằng cách sử dụng API Menu Node và các mô-đun Chế độ xem Nút của Menu .

Tạo chế độ xem với loại nội dung được yêu cầu của bạn và chọn bộ lọc theo ngữ cảnh của "Menu: ID liên kết menu" (điều này chỉ khả dụng với các mô-đun trên được cài đặt).

Trong phần "Khi giá trị bộ lọc không khả dụng", chọn "Cung cấp giá trị mặc định" và chọn "Mã PHP".

Đoạn mã sau sẽ làm điều đó, sau đó bạn chỉ cần hiển thị một khối từ chế độ xem và bạn đang ở đó:

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
Tôi nghĩ rằng bộ lọc phải là "Menu: id menu liên kết cha mẹ" để lấy con của nút hiện tại. Và mã đối số có thể là: $ current = end (menu_get_active_trail ()); trả về $ hiện tại ['mlid'];
Stefan

Cảm ơn vì điều đó. Một vài cải tiến (ngoài sửa lỗi của @ Stefan). 1) Bạn có thể sử dụng menu_load_object(arg(1))thay vì node_load()để tiết kiệm một số chi phí. 2) Bạn nên kiểm tra để đảm bảo rằng mục menu nằm trong menu bạn quan tâm. Ngay bây giờ, bạn chỉ cần trở lại đầu tiên $mlid. Bên trong foreach bạn nên thêm một điều kiện if ($data->menu_name == 'my-menu')để sửa lỗi này. và 3) Bạn có thể muốn thêm bộ lọc thứ hai menu: hiddenđể chỉ trả lại các mục không bị ẩn. Sử dụng cùng một đoạn, nhưng trả lại $data->hidden;thay vì $mlid.
Adam Balsam

2
Tôi chắc chắn sẽ không khuyến khích các mô-đun đề xuất vẫn đang trong giai đoạn phát triển.
Ambidex

@Stefan có ở đâu để có được tất cả trẻ em ở cấp độ nào không? thay vì chỉ đầu tiên.
Eli Stone

4

Các Node Hierarchy Mô-đun cho phép loại hình này của mối quan hệ, cũng như cung cấp một tích hợp quan điểm.

Hệ thống phân cấp nút cho phép các nút là con của các nút khác tạo ra hệ thống phân cấp nội dung giống như cây. Các mô-đun cung cấp:

  • 1-Click tạo menu phân cấp
  • Bánh mì phân cấp
  • Các url phân cấp tự động bằng Pathauto (và mô-đun mã thông báo)

    (ví dụ: q = aboutus / history / start).

  • Tự động tạo các menu phân cấp nếu muốn.
  • Tích hợp lượt xem tùy chọn.
  • Tích hợp truy cập nút tùy chọn.

2

Có thể điều này đã thay đổi cho D7 / Lượt xem 3, nhưng bạn không cần bất kỳ PHP nào để thực hiện hành vi mong muốn:

  1. cài đặt các mô-đun menu_view , menu_nodemenu_node_view .
  2. tạo một giao diện mới của kiểu "cây menu"
  3. thêm các trường "Menu: tiêu đề liên kết" và "Menu: mô tả"
  4. Thêm bộ lọc ngữ cảnh / đối số "Menu: ID nút"; Cung cấp giá trị mặc định "ID nội dung từ URL"
  5. Thêm mối quan hệ "Menu: id menu liên kết cha mẹ"

voila. Nó không hoạt động , nhưng nó làm.

Nó hoạt động tốt chỉ với các nút, nhưng lợi thế của việc sử dụng các liên kết menu trên hệ thống phân cấp nút là bạn không bị giới hạn trong việc xây dựng điều hướng xung quanh các nút. Bạn thậm chí có thể bao gồm các liên kết bên ngoài trong quan điểm của bạn.


Đây là một tùy chọn tốt để hiển thị các liên kết nút (và tôi thích rằng Aaron Bauman đưa ra chế độ xem mẫu này để nhập: pastebin.com/u2GjmWG7 ). Tuy nhiên, tôi gặp một số khó khăn khi làm cho các trường nút có sẵn để xem, vì OP đang yêu cầu. Làm thế nào là hoàn thành?
ngờ1ejack

Bạn sẽ có thể hiển thị các trường nút bằng cách thêm mối quan hệ vào "Menu: Node ID." Bạn có thấy một cái gì đó như thế?
aaronbauman

2

Có một mô-đun tương đối mới Lượt xem Menu Node Children Filter dường như thực hiện chính xác những gì bạn muốn:

Mô-đun này thêm bộ lọc theo ngữ cảnh vào Chế độ xem sẽ truy xuất các nút con của nút theo cấu trúc của menu.


0

Bạn đã cân nhắc sử dụng Node Reference cho mục đích này chưa?

  1. Cung cấp trường tham chiếu nút cho loại nội dung bạn muốn hiển thị.
  2. Sử dụng trường đó làm bộ lọc theo ngữ cảnh trong Chế độ xem (giá trị mặc định: ID nội dung từ url ).
  3. Thêm chế độ xem này hiển thị dưới dạng một khối cho nội dung. Nút mà nó đang được hiển thị sẽ được xem như là cha mẹ của các nút tham chiếu đến nó chẳng hạn.

Do đó, bạn có thể đạt được một kết quả tương tự như bạn có thể đang tìm kiếm.


0

Câu trả lời từ Emile là đúng, nhưng tôi đã phải dán mã PHP được đề cập trong một bộ lọc theo ngữ cảnh của loại " Menu: id menu liên kết cha mẹ ".

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

Nếu bạn sử dụng bản dịch thực thể và nút được gắn vào các menu khác nhau, đây là bản điều chỉnh mã lọc theo ngôn ngữ hiện tại. Bạn cần sao chép mã này dưới dạng mã PHP cho bộ lọc theo ngữ cảnh (id liên kết menu cha) trong chế độ xem của bạn như được giải thích trong các câu trả lời khác

 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

Từ hàng đợi vấn đề của Menu Node Views, chúng tôi có giải pháp hay này:

  • thêm bộ lọc theo ngữ cảnh với 'id liên kết menu cha',
  • chọn 'Cung cấp giá trị mặc định'
  • chọn 'mã php tùy chỉnh'
  • nhập mã sau

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.