ฉันจะค้นหารายการค่า $ string ที่มีอยู่สำหรับฟังก์ชัน user_access ($ string) ได้อย่างไร


27

user_access ($ string, $ account = NULL)

$ string: การอนุญาตเช่น "การจัดการโหนด" กำลังถูกตรวจสอบ

ฉันจะค้นหารายการค่า $ string ที่มีอยู่สำหรับuser_access()ฟังก์ชั่นได้อย่างไร

คำตอบ:


12

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

คุณสามารถเรียกใช้สคริปต์นี้ในหน้า / 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);
  }
}

26

ตามที่ @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;
}

9

ต่อไปนี้เป็นคำตอบของ 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);
  }
}

6

คุณสามารถใช้user_permission_get_modules()ฟังก์ชั่นซึ่งจะส่งกลับอาร์เรย์ของสิทธิ์ที่กำหนดไว้ทั้งหมดและโมดูลของพวกเขา

กำหนดโมดูลที่เป็นของสิทธิ์

ส่งคืนค่า

อาร์เรย์ที่เชื่อมโยงในรูปแบบ $ permission => $ module


2
หากคุณใส่ไว้ในตัวarray_keys()คุณคุณจะได้รับเฉพาะข้อมูลที่ขอเท่านั้น จากนั้นคุณสามารถใช้ผลลัพธ์user_role_grant_permissionsเช่นเพื่อให้สิทธิ์ผู้ดูแลระบบแก่สิทธิ์ผู้ดูแลระบบทั้งหมด:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross

4

วิธีที่ง่ายที่สุดคือการตรวจสอบหน้าการอนุญาต (D7: ผู้ดูแลระบบ / คน / การอนุญาต, D6: ผู้ดูแลระบบ / ผู้ใช้ / การอนุญาต) โปรดทราบว่าคุณใช้สตริงที่แสดงโดยตรงใน Drupal 6 สำหรับ 7 คุณต้องดูที่ชื่อ / ค่าช่องทำเครื่องหมาย นี่เป็นเพราะตอนนี้สิทธิ์มีชื่อและคำอธิบายที่แปลแล้วใน Drupal 7

ดังนั้นหากคุณต้องการชื่อสิทธิ์ "ดูเนื้อหาที่เผยแพร่" ใน Drupal 7 ค่าคือ "เข้าถึงเนื้อหา" ซึ่งเป็นชื่อสิทธิ์ของคุณ

หากคุณทราบว่าโมดูลใดได้รับอนุญาตมาคุณสามารถตรวจสอบการใช้งานhook_perm () (D6) / hook_pemission () (D7) ที่สอดคล้องกันของโมดูลนั้น

ในหลายกรณีคุณต้องการกำหนด pemissions ของคุณเองและใช้สิ่งเหล่านี้คุณสามารถทำได้ด้วย hooks ด้านบน


RE: "วิธีที่ง่ายที่สุดคือตรวจสอบหน้าการอนุญาต (D7: ผู้ดูแลระบบ / คน / การอนุญาต)" หน้านี้แสดงรายการการอนุญาต แต่เป็นสตริงที่มนุษย์สามารถอ่านได้แทนที่จะเป็นสตริงที่เครื่องอ่านได้
gilzero

1
ดังที่ฉันเขียนด้านล่างชื่อที่สามารถอ่านได้ของเครื่องสามารถดึงมาจากค่าของช่องทำเครื่องหมายใด ๆ เพื่อขออนุญาตที่ได้รับ
Berdir

คำตอบนี้ครอบคลุม Drupal 6 และ 7 ที่ได้รับการยอมรับเพียงคนเดียว Drupal 6 - แต่คำตอบที่ได้รับการยอมรับเป็นเคล็ดลับเรียบร้อยและอาจจะมีการเปลี่ยนแปลงได้อย่างง่ายดายสำหรับ Drupal 7 =)
เกร็ก

4

การใช้โมดูล Devel

  • หลังจากติดตั้งและเปิดใช้งานDeveladmin/config/development/develโมดูลเพื่อนำทาง มีการตั้งค่าชื่อ "แสดงชื่อการอนุญาตและโมดูลของเครื่อง" ตรวจสอบให้แน่ใจว่ามีการตรวจสอบ

  • ตอนนี้ในหน้าสิทธิ์ที่people/permissionsให้วางเมาส์เหนือชื่อสิทธิ์ที่คุณกำลังตั้งคำถาม มันอาจหน่วงเวลาหนึ่งหรือสองวินาที แต่จากนั้นค่าสตริงจะแสดง


ว้าวฉันไม่รู้เรื่องนี้เลย เห็นหลังจากฉันโพสต์คำตอบของฉัน ขอบคุณ!
Batandwa

มีประโยชน์มาก! TYVM
DrCord

น่ารักง่ายกว่าเปิดรหัสโมดูล!
bloke_zero

1

นี่คือการแก้ไขแบบฟอร์มอย่างง่าย ๆ ที่จะเพิ่มคีย์การอนุญาตให้กับชื่อในหน้าการอนุญาต ที่ควรทำให้ง่ายต่อการค้นหา คุณจะต้องเพิ่มลงในโมดูลที่กำหนดเองและแทนที่ "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 . ')';
    }
  }
}

1

ฉันสร้างตัวอย่าง 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>");
});

และขอบคุณที่Bookmarkify.itบริการที่คุณสามารถหา bookmarklet ที่นี่
Batandwa

นี่เป็นเครื่องมือที่มีประโยชน์จริง ๆ !
DrCord



0

เพียงแค่วางในบางโมดูลคุณจะเห็นสิทธิ์ของเครื่องที่/ 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>)'; 
    }
}

ความนับถือ

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