Điểm:0

theme_pre process_menu không thấy menu chính

lá cờ in

Thông tin cơ bản: Tôi có một trang web sự kiện nơi tôi muốn ẩn mục menu đăng ký sự kiện khi quá trình đăng ký sự kiện đã kết thúc.

theme_pre process_menu không kích hoạt trên bất kỳ thứ gì ngoại trừ 'menu__toolbar'. Mật mã:

function myTheme_pre process_menu(&$variables, $hook) {
  dpm($hook);
}

chỉ đưa ra kết quả "menu__toolbar" trên bất kỳ trang nào mà chủ đề của tôi đang hoạt động. Chủ đề của tôi dựa trên Bartik.

Làm cách nào để kích hoạt nó trên menu chính?

leymannx avatar
lá cờ ne
Nó chỉ là `hook_pre process_menu(&$variables)` mà không có `$hook` và sau đó là `dpm($variables);`. Tên chủ đề chỉ được chứa chữ thường và dấu gạch dưới. Bạn đã xóa bộ nhớ cache chưa? Móc tương tự có được kích hoạt từ một mô-đun tùy chỉnh không? Chính xác thì bạn đã đặt cái móc ở đâu? Menu chính hiện có hiển thị trên trang bạn đang kiểm tra không? Cập nhật câu hỏi của bạn để làm rõ.
No Sssweat avatar
lá cờ ua
Hãy thử với **[hook_menu_links_detected_alter](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21menu.api.php/function/hook_menu_links_detected_alter/9.3.x)**
No Sssweat avatar
lá cờ ua
Tuy nhiên, giải pháp thích hợp hơn sẽ là từ chối quyền truy cập bằng **[hook_entity_access](https://www.prometsource.com/blog/how-manage-hook-entity-access-with-drupal)**, như khi quyền truy cập là bị cấm, nó sẽ ẩn liên kết tự động.
apaderno avatar
lá cờ us
Các hàm tiền xử lý nhận ba đối số từ [`ThemeManager::render()`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Theme%21ThemeManager.php/function/ThemeManager%3A %3Arender/9.3.x), gọi chúng là `$preprocessor_function($variables, $hook, $info);`. Tuy nhiên, giá trị của `$hook` cũng được lưu trữ trong `$variables['theme_hook_original']`; không cần sử dụng tham số thứ hai và đó là lý do tại sao các hàm tiền xử lý thường không sử dụng tham số đó.
apaderno avatar
lá cờ us
Để ẩn một mục menu, tốt hơn là thay đổi giá trị #access của nó, như @NoSssweat đã nói. Một chức năng tiền xử lý sẽ là quá muộn cho việc này và nó sẽ là một hook sai để sử dụng, vì mục đích của nó là thay đổi cách một phần tử được hiển thị.
lá cờ in
Cảm ơn rất nhiều. hook_entity_access giải quyết gọn gàng một trong những vấn đề của tôi (vấn đề tôi đã mô tả ở trên). Có một mục menu khác mà tôi muốn ẩn nhưng không tắt: 'đăng nhập'. Khi sự kiện kết thúc, không ai ngoại trừ quản trị viên cần đăng nhập, vì vậy tôi muốn ẩn nó đi, nhưng vẫn cho phép quản trị viên sử dụng /user/login để truy cập trang web.
Điểm:0
lá cờ us

Những gì bạn nhận được trong móc $ không nói chức năng tiền xử lý được gọi cho menu nào. Đó là một gợi ý đơn giản mà Drupal đang chọn Trình quản lý chủ đề::render().

  // Gọi hook_theme_suggestions_HOOK().
  $suggestions = $this->moduleHandler->invokeAll('theme_suggestions_' . $base_theme_hook, [
    biến $,
  ]);

  // Nếu triển khai chủ đề được gọi với đề xuất chủ đề trực tiếp
  // like '#theme' => 'node__article', thêm nó vào mảng gợi ý trước
  // gọi gợi ý thay đổi hooks.
  if (isset($info['base hook'])) {
    $suggestions[] = $hook;
  }

  // Gọi hook_theme_suggestions_alter() và
  // hook_theme_suggestions_HOOK_alter().
  móc $ = [
    'theme_suggestions',
    'theme_suggestions_' . $base_theme_hook,
  ];
  $this->moduleHandler->alter($hooks, $suggestions, $variables, $base_theme_hook);
  $this->alter($hooks, $suggestions, $variables, $base_theme_hook);

  // Kiểm tra xem mỗi đề xuất có tồn tại trong sổ đăng ký chủ đề không và nếu có,
  // sử dụng nó thay vì móc cơ sở. Ví dụ, một chức năng có thể sử dụng
  // '#theme' => 'node', nhưng mô-đun có thể thêm 'node__article' làm gợi ý
  // thông qua hook_theme_suggestions_HOOK_alter(), cho phép chủ đề có
  // một tệp mẫu thay thế cho các nút bài viết.
  foreach (array_reverse($suggestions) dưới dạng $suggestion) {
    nếu ($theme_registry->has($suggestion)) {
      $info = $theme_registry->get($suggestion);
      nghỉ;
    }
  }

olivero_theme_suggestions_menu_alter() là một trong những cái móc làm thay đổi các gợi ý cho tệp mẫu menu. Trong trường hợp của bạn, có thể có một mô-đun thực hiện đề xuất tương tự.

function olivero_theme_suggestions_menu_alter(&$suggestions, mảng $variables) {
  if (isset($variables['attributes']['region'])) {
    $suggestions[] = 'menu__' . $variables['attributes']['region'];
  }
}

Những gì bạn đang tìm kiếm là tên máy menu, được lưu trữ trong $variables['menu_name'] như tài liệu trong menu.html.twig.

Nếu mục đích là ẩn một mục menu, sử dụng hook tiền xử lý đó không phải là giải pháp. Ví dụ, để ẩn một mục menu là đủ để tránh người dùng hiện đang đăng nhập có quyền truy cập vào tuyến đường được sử dụng cho mục menu đó. Trong trường hợp đó, Drupal sẽ không hiển thị mục menu.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.