ฉันสร้างบล็อกโดยทางโปรแกรม แต่ไม่รู้ว่าฉันจะกำหนดสิทธิ์การเข้าถึงให้กับโปรแกรมได้อย่างไร ฉันจะทำให้สำเร็จได้อย่างไร
ฉันสร้างบล็อกโดยทางโปรแกรม แต่ไม่รู้ว่าฉันจะกำหนดสิทธิ์การเข้าถึงให้กับโปรแกรมได้อย่างไร ฉันจะทำให้สำเร็จได้อย่างไร
คำตอบ:
การตั้งค่าอาร์เรย์ "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;
}
การใช้รหัสผู้ใช้ที่ได้รับการรับรองความถูกต้อง (ไม่ใช่แขก) จะมีการเปิดเผยบล็อกสำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้อง