Làm cách nào tôi có thể truy cập menu chính trong template_pre process_page?


7

Tôi muốn chỉ định menu chính của trang web của mình cho một biến bằng cách sử dụng template_pre process_page () để tôi có thể sử dụng một cái gì đó giống như {{main_menu}}trong mẫu trang. Có ý tưởng nào về cách tôi sẽ thực hiện việc này mà không phải gán Menu cho Vùng không?

Câu trả lời:


8

Hãy nhớ rằng menu của bạn có thể là một khối và để hiển thị nó, bạn chỉ cần tải và có được chế độ xem trong hàm tiền xử lý.

Tập tin THEME.theme

use Drupal\block\Entity\Block;
function THEME_preprocess_page(&$variables) {
  $menu = Block::load('id_main_menu');
  $variables['main_menu'] = \Drupal::entityTypeManager()->getViewBuilder('block')->view($menu);
}

trang.html.twig

...
{{main_menu}}
...

Chú ý
Bạn phải tạo khối 'main_menu' của mình ở một nơi nào đó, (cài đặt mô-đun, trang cấu trúc khối ...)


Một menu không phải là một khối. Tuy nhiên, mô-đun menu lõi cung cấp các plugin khối cho mỗi menu (hoặc một plugin có dẫn xuất).
mradcliffe

6

Tôi không khuyên bạn nên mã hóa một loạt các nội dung trong chủ đề vì nó làm tăng khó khăn trong việc hiểu những gì đang diễn ra trong trang web cho các nhà phát triển mới, nhưng điều này có thể theo một vài cách khác nhau. Nó sẽ tốt hơn để sử dụng hệ thống khối và khu vực.

Sử dụng dịch vụ menu.link_tree để xây dựng từ đầu

Điều quan trọng là phải nhận ra rằng điều này nhận được dữ liệu thô và nếu không chuyển đổi cây menu, sẽ không có kiểm tra truy cập nào được thực hiện. Điều này có thể ổn vì một menu chính nên được công khai, nhưng điều đó không nhất thiết phải như vậy.

$menu_name = "main_menu"; // I think
$menu_tree = \Drupal::service('menu.link_tree');
$parameters = new \Drupal\Core\Menu\MenuTreeParameters();
$parameters
  ->setMaxDepth(1) // Or however far down the tree you want to go.
  ->onlyEnabledLinks()
  ->excludeRoot();
$tree = $menu_tree->load($menu_name, $parameters);
// $manipulators = [['callable' => 'menu.default_tree_manipulators::checkAccess']];
// $tree = $menu_tree->transform($tree, $manipulators);
foreach ($tree as $item) {
  /** @var \Drupal\Core\Menu\MenuLinkInterface $link */
  $link = $item->link;
}

Sử dụng một thể hiện khối đã biết bằng lập trình

Xem câu trả lời của @ Berdir tại đây: https://drupal.stackexchange.com/a/153195/42650


1
Điều này trông giống như tuyến đường tôi muốn đi, nhưng khi thực hiện die (print_r ($ link)) bên trong vòng lặp đó tôi nhận được một kết quả hoàn toàn trống. Điều tương tự xảy ra khi tôi cố gắng in ra cây $. Tôi đã kiểm tra hai lần và tên menu là chính xác và phần còn lại của mã hoàn toàn giống nhau. Tôi đang thực hiện điều này trong chức năng trang tiền xử lý
Matt

1
Thế còn var_dump($link); exit;?
mradcliffe

1
vấn đề tương tự như
@Matt
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.