ฉันจะเพิ่มเงื่อนไขการเข้าถึงรายการเมนูได้อย่างไร


17

ฉันจะเพิ่มเงื่อนไขใหม่ที่ด้านบนของเงื่อนไขที่มีอยู่ที่กำหนดว่ารายการเมนูสามารถมองเห็นได้อย่างไร เงื่อนไขเหล่านี้ไม่ควร จำกัด เฉพาะการตั้งค่าการอนุญาต

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

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


แก้ไข: บางคนดูเหมือนจะเน้นที่การตอบ "ฉันจะ จำกัด ผู้ใช้ในการสร้างหนึ่งโหนดของประเภทเนื้อหา" ได้อย่างไร นั่นไม่ใช่คำถามที่นี่ คำถามคือฉันจะเพิ่มเงื่อนไขการเข้าถึงแบบกำหนดเองให้กับรายการเมนูได้อย่างไร

คำตอบ:


11

สิ่งที่คุณต้องทำคือการเพิ่มการโทรกลับของคุณผ่าน hook_menu_alter () จากนั้นภายในการโทรกลับของคุณคุณเพียงแค่ทำตรรกะของคุณแล้วส่งคืนข้อมูลผ่านการโทรกลับเดิม

เพื่อให้แน่ใจว่าคุณไม่ได้เขียนทับการเปลี่ยนแปลง hook_menu_alter () อื่น ๆ คุณควรส่งการเรียกกลับก่อนหน้านี้ไปยังการติดต่อกลับของคุณผ่านอาร์กิวเมนต์การเข้าถึง

นี่คือทฤษฎีทั้งหมด แต่รหัสควรเป็นดังนี้:

MYMODULE_menu_alter(&$items) {
  $items['menu']['access arguments'] = array_merge(array($items['menu']['access callback']), $item['menu']['access arguments']);
  $items['menu']['access callback'] = 'MYMODULE_access_callback';
}

MYMODULE_access_callback() {
  $args = func_get_args();

  // Do Stuff.
  if ($something == FALSE) {
    return FALSE;
  }

  $function = array_shift($args);
  return call_user_func_array($function, $args);
}

ดังนั้นหากฉันกำหนดฟังก์ชั่นการติดต่อกลับใหม่สิ่งนั้นจะไม่เขียนทับการติดต่อกลับเดิมหรือไม่
Chaulky

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

array_shift บน $ args กำลังทำอะไร
Chaulky

มันดึงเอาอาร์กิวเมนต์แรกออกจาก 'อาร์กิวเมนต์การเข้าถึง' ซึ่งเราสร้าง 'การเรียกกลับการเข้าถึง' เก่าขึ้น ดังนั้นถ้าการเรียกกลับเก่าคือ 'MYMODULE2_access_callback' นั่นคือสิ่งที่ array_shift จะกลับมา นอกจากนี้ยังลบมันออกจากอาร์เรย์เพื่อให้เราส่งผ่านข้อโต้แย้งที่คาดว่าจะเรียกกลับ
ถอดรหัส

1

ในการตอบกลับความคิดเห็นข้างต้นโซลูชันใน D7 จะใช้:

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node->type;

  if ($op == 'create' && $type == 'mynodetype' && db_query("SELECT 1 FROM {node} WHERE type = :type AND uid = :uid", array(':type' => $type, ':uid' => $account->uid))->fetchField()) {
    // If the user has already created a node of a specific type, they cannot
    // create any more.
    return NODE_ACCESS_DENY;
  }

  // Otherwise do not affect any node access.
  return NODE_ACCESS_IGNORE;
}

1
ดูเหมือนจะไม่มีอะไรเกี่ยวข้องกับรายการเมนู ฉันยังไม่คุ้นเคยกับ D7 มากนัก แต่ดูเหมือนว่าเฉพาะการสร้างโหนด คำถามนี้เน้นที่รายการเมนูโดยทั่วไป
Chaulky

โอ้ฉันเห็นแล้ว ... นี่เป็นการตอบกลับความคิดเห็นของฉันเพื่อขอรายละเอียดเพิ่มเติมเกี่ยวกับโซลูชัน D7 ของคุณที่แนะนำในคำตอบของคุณซึ่งชี้ไปที่โมดูล จำกัด โหนด ยังคงเป็นหัวข้อเล็กน้อย แต่ชื่นชม
Chaulky

เนื่องจากการมองเห็นของลิงค์สร้าง mynodetype นั้นควบคุมโดยฟังก์ชั่น node_access () ซึ่งจะเรียกใช้ hook นี้ใน Drupal 7
Dave Reid

1

คุณกำลังมองหาโมดูลChain Menu Access API

API การเข้าถึงเมนูเชนช่วยให้โมดูลของคุณเชื่อมโยงฟังก์ชันการเรียกกลับเมนูของตนเองเข้ากับรายการเราเตอร์เมนูของโมดูลอื่น

มีอย่างน้อยหนึ่งตัวอย่างใน Drupal Stack Exchange เกี่ยวกับวิธีการใช้งาน


-1

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


-1

บางทีคุณควรลองใช้โมดูลจำกัด โหนด

จากหน้าโครงการ:

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


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

เป็นจริงแล้วตอนนี้ฉันดูคำอธิบายโมดูลอีกครั้ง หากสิ่งนี้อยู่ใน Drupal 7 มันจะง่ายจริง ๆ เพราะคุณสามารถใช้ hook_node_access ($ node, 'create', $ account) ซึ่งจะส่งผลต่อการมองเห็นลิงค์สร้างชนิดของโหนดเอง
Dave Reid

นั่นดูน่าสนใจ. ฉันวางแผนจะย้ายไปที่ D7 ในไม่ช้า คุณจะช่วยเขียนรายละเอียดและโพสต์คำตอบได้ไหม?
Chaulky

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