Bagaimana saya bisa mengetahui daftar nilai $ string yang tersedia untuk fungsi user_access ($ string)?

27

user_access ($ string, $ account = NULL)

$ string: Izin, seperti "kelola node", sedang diperiksa.

Bagaimana saya bisa mengetahui daftar nilai $ string yang tersedia untuk user_access()fungsi?

gilzero
sumber

Jawaban:

12

Selama setiap modul dapat mendefinisikan izin mereka sendiri, tidak ada daftar "ketat" dari string tersebut. Anda perlu "membangun" itu jika Anda benar-benar perlu memiliki daftar seperti itu secara terprogram.

Anda dapat menjalankan skrip ini di halaman / devel / php. (Tentu saja, Anda memerlukan modul 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);
  }
}
Haza
sumber
26

Seperti yang dikatakan @Berdir, cara termudah untuk melihat izin mana yang tersedia adalah dengan pergi ke izin admin / orang / izin di Drupal 7.

Masalah yang terus saya temui adalah bahwa saya tidak pernah tahu string apa yang saya butuhkan untuk menyediakan sebagai 'argumen akses' untuk benar-benar memanfaatkan izin tersebut. Nah, inilah cara Anda menemukan nama string untuk izin yang ingin Anda gunakan (Contoh ini menggunakan Google Chrome.)

Langkah pertama. Buka admin / orang / izin temukan izin yang ingin Anda gunakan dan klik kanan pada kotak centang di sebelah kanan izin yang ingin Anda gunakan. Pilih 'Periksa Elemen' atau lihat sumbernya.

Contoh

Selanjutnya cari nilai kotak centang dan catat nilainya. (Dalam hal ini stringnya adalah 'buat konten kupon')

masukkan deskripsi gambar di sini

Ini adalah string yang perlu Anda berikan sebagai argumen akses di hook_menu ()

Kode Contoh: (item yang tidak relevan dihapus, jangan lupa judul, panggilan balik, dll. Di hook_menu ())

function fsrsys_menu() {
    $items = array();
    $items['my-custom-url'] = array(
        'access callback' => 'user_access',
        'access arguments' => array('create coupon content'),
    );
    return $items;
}
Citricguy
sumber
9

Ini adalah versi D7 dari jawaban Haza, dimodifikasi untuk menggunakan DSM alih-alih print_r dan meninggalkan modul yang tidak menerapkan 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);
  }
}
Fureigh
sumber
6

Anda dapat gunakan user_permission_get_modules() fungsi, yang mengembalikan array dari semua izin yang ditentukan dan modul mereka.

Tentukan modul yang memiliki izin.

Nilai pengembalian

Array asosiatif dalam format $ permit => $ module.

Елин Й.
sumber
2
Jika Anda membungkusnya array_keys()Anda jelas hanya mendapatkan informasi yang diminta. Anda kemudian dapat juga menggunakan hasilnya di user_role_grant_permissions, misalnya untuk memberikan peran admin semua izin:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
aross
4

Cara termudah adalah dengan memeriksa halaman izin (D7: admin / orang / izin, D6: admin / pengguna / izin). Perhatikan bahwa Anda langsung menggunakan string yang ditampilkan di Drupal 6, untuk 7 Anda harus melihat nama / nilai kotak centang. Ini karena izin sekarang memiliki judul dan deskripsi yang diterjemahkan dalam Drupal 7.

Jadi jika Anda ingin nama untuk izin "Lihat konten yang diterbitkan" di Drupal 7, nilainya "akses konten" yang merupakan nama izin Anda.

Jika Anda tahu dari modul mana izin itu berasal, Anda juga dapat memeriksa penerapan hook_perm () (D6) / hook_pemission () (D7) yang sesuai dari modul itu.

Dalam banyak kasus, Anda ingin menentukan pemancar Anda sendiri dan menggunakannya, Anda bisa melakukannya dengan kait di atas.

Berdir
sumber
RE: "Cara termudah adalah memeriksa halaman izin (D7: admin / orang / izin,).". Halaman menunjukkan daftar izin, tetapi mereka adalah string yang dapat dibaca manusia daripada string yang dapat dibaca mesin.
gilzero
1
Seperti yang saya tulis di bawah ini, nama yang dapat dibaca mesin dapat diekstraksi dari nilai salah satu kotak centang untuk izin yang diberikan.
Berdir
Jawaban ini mencakup Drupal 6 dan 7, yang diterima hanya Drupal 6 - tetapi jawaban yang diterima adalah trik yang rapi dan dapat dengan mudah diubah untuk Drupal 7. =)
Greg
4

Menggunakan Modul Devel

  • Setelah menginstal dan mengaktifkan modul Devel , navigasikan ke admin/config/development/devel. Ada pengaturan berjudul, "Tampilkan nama mesin izin dan modul". Pastikan itu dicentang.

  • Sekarang di halaman izin di people/permissions, arahkan kursor ke nama izin yang Anda tanyakan. Mungkin menunda satu atau dua detik, tetapi kemudian nilai string akan ditampilkan.

perencanaan
sumber
Wow, saya tidak tahu tentang ini. Lihat setelah saya memposting jawaban saya. Terima kasih!
Batandwa
Sangat berguna! TYVM.
DrCord
Manis, jauh lebih mudah daripada membuka kode modul!
bloke_zero
1

Berikut ini adalah formulir perubahan sederhana yang akan menambahkan kunci izin ke nama pada halaman izin. Itu akan membuatnya lebih mudah untuk melihatnya. Anda perlu menambahkannya ke modul khusus dan mengganti "mymodule" dengan nama modul itu.

/**
 * 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 . ')';
    }
  }
}
Randall Knutson
sumber
1

Saya membuat cuplikan JavaScript ini yang membantu saya dalam hal ini. Saya mengujinya di Drupal 7 hanya pada tema Shiny .

Ini pada dasarnya menampilkan nama mesin, diambil dari kotak centang pertama pada nama itu, ke sel pertama, di bawah label. Skrip bergantung pada jQuery, yang seharusnya tidak menjadi masalah pada Drupal 7.

Saya biasanya menempelkannya di konsol Alat Pengembang dan menjalankannya dari sana. Saya mungkin membuat bookmarklet untuk itu di masa depan.

// 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>");
});
Batandwa
sumber
Dan berkat layanan Bookmarkify.it Anda dapat menemukan bookmarklet di sini .
Batandwa
Ini alat yang sangat berguna, ty!
DrCord
1
db_query("SELECT DISTINCT {permission} FROM role_permission");
emallove
sumber
1

Ini adalah modul sederhana untuk membuatnya mudah: Access Arguments List

Salam

Bilal
sumber
0

cukup masukkan beberapa modul, Anda akan melihat izin mesin di / admin / people / permissions

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

salam

Yurii K.
sumber