Làm cách nào tôi có thể tìm ra danh sách các giá trị $ chuỗi có sẵn cho hàm user_access ($ string)?


27

user_access ($ chuỗi, $ account = NULL)

$ string: Quyền, chẳng hạn như "các nút quản trị", đang được kiểm tra.

Làm cách nào tôi có thể tìm ra danh sách các giá trị chuỗi $ có sẵn cho user_access()hàm?

Câu trả lời:


12

Miễn là mọi mô-đun có thể xác định các quyền của riêng mình, không có danh sách "nghiêm ngặt" nào của chuỗi đó. Bạn sẽ cần phải "xây dựng" nó nếu bạn thực sự cần phải có một danh sách như vậy theo chương trình.

Bạn có thể chạy tập lệnh này trong trang / devel / php. (Tất nhiên, bạn cần mô-đun 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

Như @Berdir đã nói, cách dễ nhất để xem các quyền nào khả dụng là truy cập quyền quản trị / người / quyền trong Drupal 7.

Vấn đề tôi tiếp tục gặp phải là tôi không bao giờ có thể tìm ra chuỗi nào tôi cần cung cấp như một 'đối số truy cập' để thực sự sử dụng quyền. Chà, đây là cách bạn tìm tên chuỗi cho các quyền bạn muốn sử dụng (Ví dụ này sử dụng Google Chrome.)

Bước một. Đi tới quản trị viên / người / quyền tìm quyền bạn muốn sử dụng và nhấp chuột phải vào hộp kiểm ở bên phải quyền bạn muốn sử dụng. Chọn 'Kiểm tra phần tử' hoặc chỉ cần nhìn vào nguồn.

Thí dụ

Tiếp theo tìm giá trị của hộp kiểm và lưu ý giá trị. (Trong trường hợp này, chuỗi là 'tạo nội dung phiếu giảm giá')

nhập mô tả hình ảnh ở đây

Đây là chuỗi bạn cần cung cấp làm đối số truy cập trong hook_menu ()

Mã ví dụ: (các mục không liên quan bị xóa, đừng quên tiêu đề, gọi lại, v.v. trong 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

Đây là phiên bản D7 của câu trả lời của Haza, được sửa đổi để sử dụng DSM thay vì print_r và loại bỏ các mô-đun không triển khai hook_ allow:

// 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

Bạn có thể sử dụng user_permission_get_modules()hàm, trả về một mảng của tất cả các quyền được xác định và các mô-đun của chúng.

Xác định các mô-đun mà quyền thuộc về.

Giá trị trả về

Một mảng kết hợp trong định dạng $ allow => $ module.


2
Nếu bạn bọc nó trong array_keys()bạn rõ ràng chỉ nhận được thông tin được yêu cầu. Sau đó, bạn cũng có thể sử dụng kết quả trong user_role_grant_permissions, ví dụ để cấp cho vai trò quản trị viên tất cả các quyền:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
khoảng thời gian từ

4

Cách dễ nhất là kiểm tra trang quyền (D7: admin / people / allow, D6: admin / user / allow). Lưu ý rằng bạn trực tiếp sử dụng chuỗi được hiển thị trong Drupal 6, vì 7 bạn cần xem tên / giá trị của hộp kiểm. Điều này là do các quyền hiện có tiêu đề và mô tả được dịch trong Drupal 7.

Vì vậy, nếu bạn muốn tên cho quyền "Xem nội dung được xuất bản" trong Drupal 7, giá trị là "nội dung truy cập" là tên cho phép của bạn.

Nếu bạn biết sự cho phép của mô-đun nào, bạn cũng có thể kiểm tra triển khai hook_perm () (D6) / hook_pemission () (D7) tương ứng của mô-đun đó.

Trong nhiều trường hợp, bạn muốn xác định pememony của riêng mình và sử dụng những cái này, bạn có thể làm điều đó với các hook ở trên.


RE: "Cách dễ nhất là kiểm tra trang quyền (D7: admin / people / allow,).". Trang hiển thị danh sách các quyền, nhưng chúng là chuỗi có thể đọc được của con người thay vì chuỗi có thể đọc được bằng máy.
gilzero

1
Như tôi đã viết dưới đây, tên máy có thể đọc được có thể được trích xuất từ ​​giá trị của bất kỳ hộp kiểm nào cho phép.
Berdir

Câu trả lời này bao gồm Drupal 6 và 7, câu trả lời duy nhất được chấp nhận là Drupal 6 - nhưng câu trả lời được chấp nhận là một mẹo gọn gàng và có thể dễ dàng thay đổi cho Drupal 7. =)
Greg

4

Sử dụng mô-đun phát

  • Sau khi cài đặt và kích hoạt mô-đun Devel , hãy điều hướng đến admin/config/development/devel. Có một cài đặt có tiêu đề, "Hiển thị tên máy của các quyền và mô-đun". Hãy chắc chắn rằng đã được kiểm tra.

  • Bây giờ trên trang quyền tại people/permissions, di chuột qua tên của quyền mà bạn đang đặt câu hỏi. Nó có thể trì hoãn một hoặc hai giây, nhưng sau đó giá trị chuỗi sẽ hiển thị.


Ồ, tôi không biết về điều này. Nhìn thấy nó sau khi tôi đăng câu trả lời của tôi. Cảm ơn!
Batandwa

Rất hữu dụng! TYVM.
DrCord

Ngọt ngào, dễ dàng hơn nhiều so với việc mở mã mô-đun!
bloke_zero

1

Dưới đây là một thay đổi hình thức đơn giản sẽ thêm khóa quyền vào tên trên trang quyền. Điều đó sẽ làm cho nó dễ dàng hơn để tìm kiếm nó. Bạn sẽ cần thêm nó vào một mô-đun tùy chỉnh và thay thế "mymodule" bằng tên của mô-đun đó.

/**
 * 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

Tôi đã tạo đoạn mã JavaScript này giúp tôi với điều này. Tôi đã thử nghiệm nó trong Drupal 7 chỉ với chủ đề Shiny .

Về cơ bản, nó xuất tên máy, được lấy từ hộp kiểm đầu tiên trên tên đó, vào ô đầu tiên, dưới nhãn. Kịch bản dựa trên jQuery, đây không phải là vấn đề trên Drupal 7.

Tôi thường dán nó trên bảng điều khiển Công cụ dành cho nhà phát triển và chạy nó từ đó. Tôi có thể tạo một bookmarklet cho nó trong tương lai.

// 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>");
});

Và nhờ dịch vụ Bookmarkify.it, bạn có thể tìm thấy bookmarklet tại đây .
Batandwa

Đây là một công cụ thực sự hữu ích, ty!
DrCord

1
db_query("SELECT DISTINCT {permission} FROM role_permission");


0

Chỉ cần thả vào một số mô-đun, bạn sẽ thấy quyền của máy tại / admin / people / allow

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>)'; 
    }
}

Trân trọng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.