Score:0

theme_preprocess_menu ไม่เห็นเมนูหลัก

ธง in

ความเป็นมา: ฉันมีเว็บไซต์กิจกรรมที่ฉันต้องการซ่อนรายการเมนูการลงทะเบียนกิจกรรมเมื่อปิดการลงทะเบียนสำหรับกิจกรรม

theme_preprocess_menu ไม่ทำงานบนสิ่งใดเลย ยกเว้น 'menu__toolbar' รหัส:

ฟังก์ชัน myTheme_preprocess_menu(&$ตัวแปร, $hook) {
  dpm($เบ็ด);
}

เพียงให้ผลลัพธ์ "menu__toolbar" ในหน้าใด ๆ ที่ธีมของฉันทำงานอยู่ ธีมของฉันขึ้นอยู่กับ Bartik

ฉันจะทำให้ทริกเกอร์บนเมนูหลักได้อย่างไร

leymannx avatar
ne flag
มันเป็นเพียง `hook_preprocess_menu(&$variables)` โดยไม่มี `$hook` แล้วก็ `dpm($variables);` ชื่อธีมต้องมีเฉพาะตัวอักษรพิมพ์เล็กและขีดล่างเท่านั้น คุณล้างแคชหรือไม่ hook เดียวกันถูกทริกเกอร์จากโมดูลที่กำหนดเองหรือไม่ คุณวางเบ็ดไว้ตรงไหนกันแน่? ขณะนี้เมนูหลักปรากฏอยู่ในหน้าที่คุณกำลังตรวจสอบหรือไม่ อัปเดตคำถามของคุณเพื่อความชัดเจน
No Sssweat avatar
ua flag
ลองกับ **[hook_menu_links_discovered_alter](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Menu%21menu.api.php/function/hook_menu_links_discovered_alter/9.3.x)**
No Sssweat avatar
ua flag
แต่วิธีแก้ปัญหาที่เหมาะสมกว่าคือการปฏิเสธการเข้าถึงด้วย **[hook_entity_access](https://www.prometsource.com/blog/how-manage-hook-entity-access-with-drupal)** เช่นเดียวกับเมื่อการเข้าถึง ห้ามมันซ่อนลิงค์โดยอัตโนมัติ
apaderno avatar
us flag
ฟังก์ชันการประมวลผลล่วงหน้าได้รับสามอาร์กิวเมนต์จาก %3Arender/9.3.x) ซึ่งเรียกมันว่า `$preprocessor_function($variables, $hook, $info);` ค่าของ `$hook` จะถูกเก็บไว้ใน `$variables['theme_hook_original']` ด้วยเช่นกัน ไม่มีความจำเป็นต้องใช้พารามิเตอร์ตัวที่สอง และนั่นคือสาเหตุที่โดยปกติแล้วฟังก์ชันการประมวลผลล่วงหน้าจะไม่ใช้พารามิเตอร์นี้
apaderno avatar
us flag
หากต้องการซ่อนรายการเมนู คุณควรเปลี่ยนค่า #access ตามที่ @NoSsweat กล่าว ฟังก์ชันการประมวลผลล่วงหน้าจะสายเกินไปสำหรับสิ่งนี้ และอาจเป็นการใช้ฮุกที่ไม่ถูกต้อง เนื่องจากจุดประสงค์ของฟังก์ชันคือเปลี่ยนวิธีการแสดงผลองค์ประกอบ
in flag
ขอบคุณมาก ๆ. hook_entity_access แก้ปัญหาหนึ่งของฉันอย่างเรียบร้อย (ที่ฉันอธิบายไว้ข้างต้น) มีอีกหนึ่งรายการเมนูที่ฉันต้องการซ่อนแต่ปิดใช้งานไม่ได้: 'เข้าสู่ระบบ' เมื่อกิจกรรมปิดลง ไม่มีใครนอกจากผู้ดูแลระบบจำเป็นต้องเข้าสู่ระบบ ดังนั้นฉันจึงต้องการซ่อนไว้ แต่ก็ยังอนุญาตให้ผู้ดูแลระบบใช้ /user/login เพื่อเข้าถึงไซต์ได้
Score:0
ธง us

สิ่งที่คุณได้รับใน $ตะขอ ไม่ได้บอกว่าเมนูใดที่เรียกใช้ฟังก์ชันการประมวลผลล่วงหน้า เป็นคำแนะนำง่ายๆ ที่ Drupal กำลังดำเนินการอยู่ ThemeManager::render().

  // เรียกใช้ hook_theme_suggestions_HOOK()
  $suggestions = $this->moduleHandler->invokeAll('theme_suggestions_' . $base_theme_hook, [
    $ตัวแปร
  ]);

  // หากมีการเรียกใช้ธีมพร้อมกับคำแนะนำธีมโดยตรง
  // เช่น '#theme' => 'node__article' ให้เพิ่มไปยังอาร์เรย์คำแนะนำก่อนหน้า
  // เรียกใช้คำแนะนำแก้ไข hooks
  ถ้า (isset($info['base hook'])) {
    $suggestions[] = $เบ็ด;
  }

  // เรียกใช้ hook_theme_suggestions_alter() และ
  // hook_theme_suggestions_HOOK_alter()
  $ตะขอ = [
    'theme_suggestions',
    'theme_suggestions_' . $base_theme_hook,
  ];
  $this->moduleHandler->alter($hooks, $suggestions, $variables, $base_theme_hook);
  $this->alter($hooks, $suggestions, $variables, $base_theme_hook);

  // ตรวจสอบว่ามีคำแนะนำแต่ละข้ออยู่ในรีจิสทรีของธีมหรือไม่ และถ้ามี
  // ใช้แทน hook ฐาน ตัวอย่างเช่น ฟังก์ชันอาจใช้
  // '#theme' => 'node' แต่โมดูลสามารถเพิ่ม 'node__article' เป็นคำแนะนำได้
  // ผ่าน hook_theme_suggestions_HOOK_alter() ทำให้มีธีม
  // ไฟล์เทมเพลตสำรองสำหรับโหนดบทความ
  foreach (array_reverse($suggestions) เป็น $suggestion) {
    ถ้า ($theme_registry->has($suggestion)) {
      $info = $theme_registry->get($suggestion);
      หยุดพัก;
    }
  }

Olivero_theme_suggestions_menu_alter() เป็นหนึ่งในตะขอที่เปลี่ยนคำแนะนำสำหรับไฟล์เทมเพลตเมนู อาจมีโมดูลที่ทำตามคำแนะนำที่คล้ายกัน ในกรณีของคุณ

ฟังก์ชัน Olivero_theme_suggestions_menu_alter (&$ คำแนะนำ, อาร์เรย์ $ ตัวแปร) {
  ถ้า (isset($variables['attributes']['region'])) {
    $suggestions[] = 'เมนู__' $variables['attributes']['region'];
  }
}

สิ่งที่คุณกำลังมองหาคือชื่อเครื่องเมนูที่เก็บไว้ใน $ตัวแปร['menu_name'] ตามเอกสารใน menu.html.twig.

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

โพสต์คำตอบ

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