ฉันสร้างบล็อกโดยทางโปรแกรม แต่ไม่รู้ว่าฉันจะกำหนดสิทธิ์การเข้าถึงให้กับโปรแกรมได้อย่างไร ฉันจะทำให้สำเร็จได้อย่างไร
ฉันสร้างบล็อกโดยทางโปรแกรม แต่ไม่รู้ว่าฉันจะกำหนดสิทธิ์การเข้าถึงให้กับโปรแกรมได้อย่างไร ฉันจะทำให้สำเร็จได้อย่างไร
คำตอบ:
การตั้งค่าอาร์เรย์ "role" ในอาร์เรย์ที่ส่งคืนจากhook_block_info()ไม่ทำงานเนื่องจาก:
บทบาทที่ได้รับอนุญาตให้ดูบล็อกและตั้งอยู่ในส่วนต่อประสานผู้ใช้จะถูกบันทึกจากblock_admin_configure_submit ()ในตาราง "block_role"
$query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
foreach (array_filter($form_state['values']['roles']) as $rid) {
  $query->values(array(
    'rid' => $rid,
    'module' => $form_state['values']['module'],
    'delta' => $form_state['values']['delta'],
  ));
}
$query->execute();รหัสที่ตัดสินใจว่าบล็อกใดที่ควรแสดงต่อผู้ใช้ที่เข้าสู่ระบบในปัจจุบันนั้นมีอยู่ในblock_block_list_alter ()ซึ่งเป็นการใช้งานของhook_block_list_alter ()และใช้เฉพาะเนื้อหาของตารางนั้น
$result = db_query('SELECT module, delta, rid FROM {block_role}');
foreach ($result as $record) {
  $block_roles[$record->module][$record->delta][] = $record->rid;
}
foreach ($blocks as $key => $block) {
  if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
    // This block was added by a contrib module, leave it in the list.
    continue;
  }
  // If a block has no roles associated, it is displayed for every role.
  // For blocks with roles associated, if none of the user's roles matches
  // the settings from this block, remove it from the block list.
  if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
    // No match.
    unset($blocks[$key]);
    continue;
  }
  // …
}ไม่มีอีกฟังก์ชั่น Drupal ที่ตรวจสอบคุณสมบัติบทบาทในข้อมูลที่ส่งคืนจากhook_block_info()และไม่มีเนื้อหาของตาราง "block_role" ที่ผสานกับสิ่งที่ส่งคืนจากhook_block_info()การนำไปใช้งาน
คุณสามารถตรวจสอบว่าผู้ใช้มีบทบาทที่จำเป็นในการดูบล็อกhook_block_view()แต่ ณ จุดนั้น Drupal กำลังแสดงบล็อกอยู่แล้ว นั่นหมายความว่าผู้ใช้จะยังคงเห็นชื่อบล็อกหากมีการตั้งค่าไว้แล้ว
สิ่งที่คุณสามารถทำได้คือการนำhook_block_list_alter()ไปใช้เพื่อลบข้อมูลเกี่ยวกับบล็อกนั้นเมื่อผู้ใช้ไม่มีบทบาทที่ต้องการ 
เพื่อหลีกเลี่ยงความสับสนของผู้ใช้ที่ดูแลบล็อกฉันจะแก้ไขฟอร์มที่ใช้ในการแก้ไขบล็อกและปิดการใช้งานฟิลด์แบบฟอร์มที่ใช้เพื่อกำหนดบทบาทที่สามารถเห็นบล็อกนั้นเนื่องจากโมดูลที่ใช้มันจะใช้รายการของตัวเอง ของบทบาท อย่างน้อยโค้ดขั้นต่ำควรแสดงข้อความเกี่ยวกับการตั้งค่าบทบาทที่ไม่มีผลกระทบใด ๆ แต่ฉันจะปิดใช้งานองค์ประกอบแบบฟอร์มสำหรับการตั้งค่าบทบาทด้วย
เนื่องจากโมดูลบล็อกแสดงฟิลด์แบบฟอร์มเพื่อเลือกบทบาทที่เห็นบล็อกอยู่แล้วคุณสามารถตั้งค่าเริ่มต้นสำหรับบล็อกของคุณและให้ผู้ใช้ผู้ดูแลระบบเปลี่ยนได้ถ้าจำเป็น
ตามการตรวจสอบบทบาทที่ผู้ใช้มีเมื่อเทียบกับการตรวจสอบสิทธิ์ที่ผู้ใช้มีอยู่เป็นที่ต้องการอย่างยิ่งโดยเฉพาะอย่างยิ่งเมื่อทางเลือกอื่นจะเข้ารหัสรายการของบทบาทในโมดูลอย่างหนัก 
ดังที่แสดงจากโมดูลบล็อกการใช้สิทธิ์ไม่ใช่ทางเลือกอื่นเท่านั้น: โมดูลอาจมีการตั้งค่าสำหรับการตัดสินใจว่าบทบาทใดที่ได้รับอนุญาตให้เห็นบางสิ่งบางอย่าง 
เห็นได้ชัดว่ามันไม่คุ้มที่จะมีการตั้งค่าสำหรับบทบาทที่อนุญาตให้ทำบางสิ่งบางอย่าง ฉันจินตนาการด้วยว่าผู้ใช้ที่เป็นผู้ดูแลระบบนั้นหมายความว่าอย่างไรหาก 10 โมดูลจะมีการตั้งค่าของตัวเองสำหรับบทบาทที่ได้รับอนุญาตให้ทำบางสิ่งแทนที่จะใช้สิทธิ์และอนุญาตให้ผู้ใช้ผู้ดูแลระบบใช้หน้าเดียวในการตั้งค่า
ใน hook_block_info ของคุณคุณสามารถลองดังนี้:
$blocks['myblock'] = array(
   ...
   'roles' => array(
      'administrator' => '3',
      'authenticated user' => '2',
   )
              สมมติว่าคุณกำลังสร้างบล็อกด้วย hook_block_info () จากนั้นคุณสามารถทำ user_access () ในฟังก์ชั่น hook_block_view () ของคุณ ตรวจสอบapi docsเนื่องจากพวกเขามีตัวอย่างนี้
เป็นไปไม่ได้ใน hook_block_info () แต่คุณสามารถใช้แบบสอบถามนี้เพื่อให้ได้สิ่งนี้ เปลี่ยน MODULE_NAME, BLOCK_DELTA และ RID ตามลำดับ
$query = db_insert('block_role')
  ->fields(array(
    'module' => 'MODULE_NAME', 
    'delta' => 'BLOCK_DELTA', 
    'rid' => 2, // Authenticated User
  ))
  ->execute();
              ใน hook_block_view คุณสามารถใช้global $userเพื่อรับข้อมูลเกี่ยวกับผู้ใช้จากนั้นขึ้นอยู่กับบทบาทของผู้ใช้ที่คุณสามารถกำหนดให้แตกต่างกันblock['subject']และblock['content']หรือไม่ได้กำหนดหัวเรื่องและเนื้อหาใด ๆ เพื่อบล็อกหากไม่สามารถมองเห็นบทบาทนั้นได้ นี่คือตัวอย่าง:
function ModuleNAME_block_view($delta = '') {
  switch ($delta) {
    case 'Your_BLOCK' :
      Global $user;
      if($user->uid != '0') {
        $block['subject'] = 'SUBJECT';
        $block['content'] = 'SOME CONTENT OR A FUNCTION FOR BLOCK';
      }
      break;
  }
  return $block;
}
การใช้รหัสผู้ใช้ที่ได้รับการรับรองความถูกต้อง (ไม่ใช่แขก) จะมีการเปิดเผยบล็อกสำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้อง