user_access ($ string, $ account = NULL)
$ string: การอนุญาตเช่น "การจัดการโหนด" กำลังถูกตรวจสอบ
ฉันจะค้นหารายการค่า $ string ที่มีอยู่สำหรับuser_access()
ฟังก์ชั่นได้อย่างไร
user_access ($ string, $ account = NULL)
$ string: การอนุญาตเช่น "การจัดการโหนด" กำลังถูกตรวจสอบ
ฉันจะค้นหารายการค่า $ string ที่มีอยู่สำหรับuser_access()
ฟังก์ชั่นได้อย่างไร
คำตอบ:
ตราบใดที่ทุกโมดูลสามารถกำหนดสิทธิ์ของตนเองได้จะไม่มีรายการ "เข้มงวด" ของสตริงเหล่านั้น คุณจะต้อง "สร้าง" มันถ้าคุณจำเป็นต้องมีรายการดังกล่าวโดยทางโปรแกรม
คุณสามารถเรียกใช้สคริปต์นี้ในหน้า / devel / php (แน่นอนคุณต้องมีโมดูลDevel )
// Render role/permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
print_r($module);
// Drupal 6
// if ($permissions = module_invoke($module, 'perm')) {
// print_r($permissions);
// }
// Drupal 7
if ($permissions = module_invoke($module, 'permission')) {
print_r($permissions);
}
}
ตามที่ @Berdir กล่าวว่าวิธีที่ง่ายที่สุดในการดูว่ามีการอนุญาตใดให้ไปที่สิทธิ์ผู้ดูแลระบบ / บุคคล / การอนุญาตใน Drupal 7
ปัญหาที่ฉันยังคงทำงานต่อไปคือฉันไม่สามารถเข้าใจได้ว่าสตริงใดที่ฉันต้องการให้เป็น 'อาร์กิวเมนต์การเข้าถึง' เพื่อใช้ประโยชน์จากการได้รับอนุญาต นี่คือวิธีที่คุณค้นหาชื่อสตริงสำหรับสิทธิ์ที่คุณต้องการใช้ (ตัวอย่างนี้ใช้ Google Chrome)
ขั้นตอนแรก. ไปที่ผู้ดูแลระบบ / คน / การอนุญาตค้นหาสิทธิ์ที่คุณต้องการใช้และคลิกขวาที่ช่องทำเครื่องหมายทางด้านขวาของสิทธิ์ที่คุณต้องการใช้ เลือก 'ตรวจสอบองค์ประกอบ' หรือเพียงแค่ดูที่แหล่งที่มา
ค้นหาค่าของกล่องกาเครื่องหมายถัดไปและบันทึกค่า (ในกรณีนี้สตริงคือ 'สร้างเนื้อหาคูปอง')
นี่คือสตริงที่คุณต้องระบุเพื่อเป็นอาร์กิวเมนต์การเข้าถึงในhook_menu ()
รหัสตัวอย่าง: (นำรายการที่ไม่เกี่ยวข้องออกแล้วอย่าลืมชื่อเรื่องการติดต่อกลับ ฯลฯ ในhook_menu ())
function fsrsys_menu() {
$items = array();
$items['my-custom-url'] = array(
'access callback' => 'user_access',
'access arguments' => array('create coupon content'),
);
return $items;
}
ต่อไปนี้เป็นคำตอบของ Haza รุ่น D7 ซึ่งปรับเปลี่ยนให้ใช้ DSM แทน print_r และไม่ใช้โมดูลที่ไม่ได้ใช้ hook_permission:
// Render permission overview:
$options = array();
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
if ($permissions = module_invoke($module, 'permission')) {
// List only the modules that have permissions.
dsm($module);
dsm($permissions);
}
}
คุณสามารถใช้user_permission_get_modules()
ฟังก์ชั่นซึ่งจะส่งกลับอาร์เรย์ของสิทธิ์ที่กำหนดไว้ทั้งหมดและโมดูลของพวกเขา
กำหนดโมดูลที่เป็นของสิทธิ์
ส่งคืนค่า
อาร์เรย์ที่เชื่อมโยงในรูปแบบ $ permission => $ module
วิธีที่ง่ายที่สุดคือการตรวจสอบหน้าการอนุญาต (D7: ผู้ดูแลระบบ / คน / การอนุญาต, D6: ผู้ดูแลระบบ / ผู้ใช้ / การอนุญาต) โปรดทราบว่าคุณใช้สตริงที่แสดงโดยตรงใน Drupal 6 สำหรับ 7 คุณต้องดูที่ชื่อ / ค่าช่องทำเครื่องหมาย นี่เป็นเพราะตอนนี้สิทธิ์มีชื่อและคำอธิบายที่แปลแล้วใน Drupal 7
ดังนั้นหากคุณต้องการชื่อสิทธิ์ "ดูเนื้อหาที่เผยแพร่" ใน Drupal 7 ค่าคือ "เข้าถึงเนื้อหา" ซึ่งเป็นชื่อสิทธิ์ของคุณ
หากคุณทราบว่าโมดูลใดได้รับอนุญาตมาคุณสามารถตรวจสอบการใช้งานhook_perm () (D6) / hook_pemission () (D7) ที่สอดคล้องกันของโมดูลนั้น
ในหลายกรณีคุณต้องการกำหนด pemissions ของคุณเองและใช้สิ่งเหล่านี้คุณสามารถทำได้ด้วย hooks ด้านบน
การใช้โมดูล Devel
หลังจากติดตั้งและเปิดใช้งานDeveladmin/config/development/devel
โมดูลเพื่อนำทาง มีการตั้งค่าชื่อ "แสดงชื่อการอนุญาตและโมดูลของเครื่อง" ตรวจสอบให้แน่ใจว่ามีการตรวจสอบ
ตอนนี้ในหน้าสิทธิ์ที่people/permissions
ให้วางเมาส์เหนือชื่อสิทธิ์ที่คุณกำลังตั้งคำถาม มันอาจหน่วงเวลาหนึ่งหรือสองวินาที แต่จากนั้นค่าสตริงจะแสดง
นี่คือการแก้ไขแบบฟอร์มอย่างง่าย ๆ ที่จะเพิ่มคีย์การอนุญาตให้กับชื่อในหน้าการอนุญาต ที่ควรทำให้ง่ายต่อการค้นหา คุณจะต้องเพิ่มลงในโมดูลที่กำหนดเองและแทนที่ "mymodule" ด้วยชื่อของโมดูลนั้น
/**
* Implements hook_form_FORM_ID_alter().
*/
function mymodule_form_user_admin_permissions_alter(&$form, $form_state) {
foreach ($form['permission'] as $key => &$item) {
if (isset($item['#type']) && $item['#type'] == 'item') {
$item['#markup'] .= ' (' . $key . ')';
}
}
}
ฉันสร้างตัวอย่าง JavaScript นี้ที่ช่วยฉันด้วยสิ่งนี้ ผมทดสอบใน Drupal 7 เฉพาะในรูปแบบเงา
โดยทั่วไปแล้วจะแสดงชื่อเครื่องที่นำมาจากช่องแรกในชื่อนั้นไปยังเซลล์แรกภายใต้ฉลาก สคริปต์อาศัย jQuery ซึ่งไม่น่าจะมีปัญหากับ Drupal 7
ฉันมักจะวางลงในคอนโซลเครื่องมือสำหรับนักพัฒนาและเรียกใช้จากที่นั่น ฉันอาจสร้าง bookmarklet สำหรับมันในอนาคต
// Go through each of the rows on the permissin table
rows = jQuery('#permissions tr');
rows.each(function() {
// Get the first checkbox in the row.
checkbox = jQuery('.checkbox .form-checkbox', this).first();
// Get the first cell, containing the permission label.
nameCell = jQuery('td:first-child', this);
// In case this is not a permission row
if(checkbox.length == 0) {
return;
}
// Embed the permission maching name on permission label cell.
nameCell.append("<div><code>" + checkbox.val() + "</code></div>");
});
db_query("SELECT DISTINCT {permission} FROM role_permission");
นี่เป็นโมดูลง่าย ๆ ที่จะทำให้ง่ายขึ้น: เข้าถึงรายการอาร์กิวเมนต์
ความนับถือ
เพียงแค่วางในบางโมดูลคุณจะเห็นสิทธิ์ของเครื่องที่/ admin / คน / สิทธิ์
function YOURMODULE_form_user_admin_permissions_alter(&$form, &$form_state)
{
$perms = &$form['permission'];
$group_counter = 0;
foreach ($perms as $k => &$v) {
if ($k == $group_counter) { // skip fieldsets
$group_counter++;
continue;
}
$v['#markup'] .= ' (<span class="description" style="color:brown">'.$k.'</span>)';
}
}
ความนับถือ
array_keys()
คุณคุณจะได้รับเฉพาะข้อมูลที่ขอเท่านั้น จากนั้นคุณสามารถใช้ผลลัพธ์user_role_grant_permissions
เช่นเพื่อให้สิทธิ์ผู้ดูแลระบบแก่สิทธิ์ผู้ดูแลระบบทั้งหมด:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));