ลิงก์เมนูซ่อนโมดูลการเข้าถึงเนื้อหา


10

ฉันกำลังใช้โมดูลการเข้าถึงเนื้อหากับ Drupal 7 เมื่อฉัน จำกัด การเข้าถึงโหนดจากบทบาทที่เฉพาะเจาะจงมันก็ซ่อนลิงค์ในเมนู

มีวิธีใดที่จะแสดงลิงค์ที่ถูก จำกัด ในเมนูหลัก?


คุณสร้างเมนูอย่างไร programatically? หรือใช้ผู้ดูแลระบบ UI ที่admin/structure/menu/manage/main-menu/add?
AjitS

ฉันกำลังเพิ่มเมนูเมื่อสร้างเนื้อหา ตัวเลือกที่ด้านล่าง 'ระบุลิงก์เมนู'
monymirza

คำตอบ:


1

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

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


ฉันจะต้องใช้โมดูลการเข้าถึงเนื้อหาด้วยหรือไม่
monymirza

เมนูด้วยตัวเองจะไม่แสดงโหนดที่ถูกบล็อก ฉันจะสร้างโมดูลเพื่อดึงข้อมูลโหนดของเมนู จากนั้นคุณสามารถเลือกที่จะแสดงลิงค์สำหรับทุกโหนด (หากผู้ใช้ไม่มีสิทธิ์เข้าถึงเขาจะเห็นหน้า 403) หรือตรวจสอบสิทธิ์การเข้าถึงเนื้อหาของโมดูลสำหรับแต่ละโหนดและไม่แสดงลิงก์หากผู้ใช้ไม่แสดง ไม่มีสิทธิ์เข้าถึง
david ruiz

1

ฉันทำสิ่งนี้ผ่านโมดูลที่กำหนดเอง:

function mymodule_form_menu_edit_item_alter(&$form, &$form_state, $form_id) {
     if ($form_state['build_info']['args'][0] == 'edit') {
       $item = $form_state['build_info']['args'][1];

       $form['ignore_access_roles'] = array(
         '#type' => 'checkboxes',
         '#multiple' => TRUE,
         '#title' => t("Ignore access"),
         '#options' => user_roles(),
         '#description' => t("If a user with one of the selected roles has no access to the menu item's path, the menu item is <strong>not</strong> hidden."),
         '#default_value' => empty($item['options']['ignore_access_roles']) ? array() : $item['options']['ignore_access_roles'],
       );

       $form['#validate'][] = 'mymodule_form_menu_edit_item_validate';
     }
   }

   function mymodule_form_menu_edit_item_validate(&$form, &$form_state) {
     if (isset($form_state['values']['ignore_access_roles'])) {
       $form_state['values']['options']['ignore_access_roles'] = $form_state['values']['ignore_access_roles'];


       $form_state['values']['options']['alter'] = TRUE;
     }
   }


   function mymodule_translated_menu_link_alter(&$link, $map) {
     if (!empty($link['options']['ignore_access_roles']) && empty($link['access'])) {

       global $user;

       // Get role ids for which the ignore access option applies.
       $rids = array_values($link['options']['ignore_access_roles']);

       $matching_rids = array_intersect(array_keys($user->roles), $rids);

       if (!empty($matching_rids)) {
         // User has one of the specified roles: override menu link access.
         $link['access'] = TRUE;

         // Localize. This must be done because it is only done for links with
         // access TRUE in _menu_link_translate.
         _menu_item_localize($link, $map, TRUE);
       }
     }
   }

0

ฉันค่อนข้างมั่นใจว่าคุณจะต้องเขียนโมดูลที่กำหนดเองเพื่อจัดการกับสิ่งนี้ นี่คือแนวคิดของฉัน: ผ่อนคลายข้อ จำกัด ในการเข้าถึงเนื้อหาเช่นให้ผู้ใช้ดูเนื้อหาของคุณ ดังนั้นโมดูลที่กำหนดเองของคุณจะต้องใช้ hook_node_load () และส่งออกการตอบสนอง HTTP 403 HTTP เมื่อโหลดโหนดที่ผู้ใช้ของคุณไม่ควรเห็น นอกจากนี้ควรใช้ hook_permission () ดังนั้นคุณจะสามารถกำหนดค่าการเข้าถึงได้ง่ายที่หน้าสิทธิ์

นี่คือตัวอย่างรวดเร็วที่ซ่อนโหนดทั้งหมดและการกรองตามประเภทเนื้อหาและการอนุญาต:

function mymodule_permission() {
  return array('access reserved content');
}

function mymodule_node_load($nodes, $types) {
  if (in_array('my_reserved_content_type', $types)) {
    if (!user_access('access reserved content')) {
      drupal_access_denied();
    }
  }
}

หรือคุณสามารถซ่อนบางส่วนของเขตข้อมูลโหนดแทนที่จะส่งคืน 403 แต่สิ่งนี้ไม่เป็นไปตามเอกสาร API สำหรับ hook_node_load ()


ฉันกำลังเพิ่มเมนูเมื่อสร้างเนื้อหา ตัวเลือกที่ด้านล่าง 'ระบุลิงก์เมนู'
monymirza

ฉันจะต้องใช้โมดูลการเข้าถึงเนื้อหาด้วยหรือไม่
monymirza

0

คุณสามารถใช้โมดูล "มองเห็นได้ตลอดเวลา"

คำตอบโดยละเอียดเพิ่มเติมเกี่ยวกับคำถามของคุณอยู่ที่นี่https://drupal.stackexchange.com/a/52149/7313


ฉันใช้ แต่ไม่มีทางออก
monymirza

คุณหมายถึง "ไม่มีทางออก" คุณได้ติดตั้งโมดูลนั้นหรือไม่?
Eugene Fidelin

ใช่ฉันใช้โมดูลนี้ และนี่ไม่ได้ทำงานสำหรับฉัน ...
monymirza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.