Wie finde ich eine Liste der verfügbaren $ string-Werte für die Funktion user_access ($ string) heraus?

27

user_access ($ string, $ account = NULL)

$ string: Die Berechtigung, z. B. "Knoten verwalten", auf die geprüft wird.

Wie kann ich eine Liste der verfügbaren $ string-Werte für user_access()function finden?

Gilzero
quelle

Antworten:

12

Solange jedes Modul seine eigenen Berechtigungen definieren kann, gibt es keine "strenge" Liste dieser Zeichenfolgen. Sie müssen es "konstruieren", wenn Sie eine solche Liste wirklich programmgesteuert benötigen.

Sie können dieses Skript in einer / devel / php-Seite ausführen. (Natürlich benötigen Sie das Devel- Modul.)

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

Wie @Berdir sagte, ist der einfachste Weg, um zu sehen, welche Berechtigungen verfügbar sind, zu den Berechtigungen admin / people / permissions in Drupal 7 zu gehen.

Das Problem, auf das ich stieß, war, dass ich nie herausfinden konnte, welche Zeichenfolge ich als 'Zugriffsargument' angeben musste, um die Berechtigung tatsächlich zu nutzen. Nun, hier finden Sie den String-Namen für die Berechtigungen, die Sie verwenden möchten (In diesem Beispiel wird Google Chrome verwendet.)

Schritt eins. Gehen Sie zu admin / people / permissions und suchen Sie die Berechtigung, die Sie verwenden möchten. Klicken Sie mit der rechten Maustaste auf ein Kontrollkästchen rechts neben der Berechtigung, die Sie verwenden möchten. Wählen Sie 'Inspect Element' oder schauen Sie sich einfach die Quelle an.

Beispiel

Suchen Sie als Nächstes nach dem Wert des Kontrollkästchens und notieren Sie den Wert. (In diesem Fall lautet die Zeichenfolge "Gutscheininhalt erstellen".)

Bildbeschreibung hier eingeben

Dies ist die Zeichenfolge, die Sie als Zugriffsargument in hook_menu () angeben müssen .

Beispielcode: (nicht relevante Elemente entfernt, Titel, Rückruf usw. in hook_menu () nicht vergessen )

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

Hier ist eine D7-Version von Hazas Antwort, geändert, um DSM anstelle von print_r zu verwenden und Module wegzulassen, die hook_permission nicht implementieren:

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

Sie können user_permission_get_modules()function verwenden, die ein Array aller definierten Berechtigungen und ihrer Module zurückgibt.

Bestimmen Sie die Module, zu denen Berechtigungen gehören.

Rückgabewert

Ein assoziatives Array im Format $ permission => $ module.

Елин Й.
quelle
2
Wenn Sie es einwickeln, erhalten array_keys()Sie offensichtlich nur die angeforderten Informationen. Sie können das Ergebnis dann beispielsweise auch verwenden user_role_grant_permissions, um der Administratorrolle alle Berechtigungen zu erteilen:user_role_grant_permissions(variable_get("user_admin_role"), array_keys(user_permission_get_modules()));
Am
4

Am einfachsten ist es, die Berechtigungsseite zu überprüfen (D7: admin / people / permissions, D6: admin / user / permissions). Beachten Sie, dass Sie die angezeigte Zeichenfolge direkt in Drupal 6 verwenden. Für 7 müssen Sie den Namen / Wert des Kontrollkästchens überprüfen. Dies liegt daran, dass Berechtigungen in Drupal 7 jetzt einen übersetzten Titel und eine übersetzte Beschreibung haben.

Wenn Sie also den Namen für die Berechtigung "Veröffentlichten Inhalt anzeigen" in Drupal 7 möchten, lautet der Wert "Zugriffsinhalt". Dies ist Ihr Berechtigungsname.

Wenn Sie wissen, von welchem ​​Modul die Berechtigung stammt, können Sie auch die entsprechende Implementierung von hook_perm () (D6) / hook_pemission () (D7) für dieses Modul überprüfen .

In vielen Fällen möchten Sie Ihre eigenen Pemissionen definieren und diese verwenden. Dies können Sie mit den oben genannten Hooks tun.

Berdir
quelle
RE: "Am einfachsten ist es, die Berechtigungsseite zu überprüfen (D7: admin / people / permissions,)." Auf der Seite wird eine Liste der Berechtigungen angezeigt, es handelt sich jedoch um eine von Menschen lesbare Zeichenfolge und nicht um eine maschinenlesbare Zeichenfolge.
Gilzero
1
Wie ich weiter unten geschrieben habe, kann der maschinenlesbare Name aus dem Wert aller Kontrollkästchen für eine bestimmte Berechtigung extrahiert werden.
Berdir
Diese Antwort deckt Drupal 6 und 7 ab, die akzeptierte nur Drupal 6 - aber die akzeptierte Antwort ist ein ordentlicher Trick und könnte leicht für Drupal 7 geändert werden. =)
Greg
4

Verwenden des Entwicklungsmoduls

  • Navigieren Sie nach der Installation und Aktivierung des Devel- Moduls zu admin/config/development/devel. Es gibt eine Einstellung mit dem Titel "Computernamen von Berechtigungen und Modulen anzeigen". Stellen Sie sicher, dass dies aktiviert ist.

  • Bewegen Sie nun auf der Berechtigungsseite unter people/permissionsden Namen der Berechtigung, die Sie in Frage stellen. Es kann eine oder zwei Sekunden dauern, aber dann wird der Zeichenfolgenwert angezeigt.

mlanning
quelle
Wow, ich wusste nichts davon. Sah es, nachdem ich meine Antwort gepostet hatte. Vielen Dank!
Batandwa
Sehr hilfreich! TYVM.
DrCord
Süß, viel einfacher als den Modulcode zu öffnen!
bloke_zero
1

Hier ist eine einfache Formularänderung, die dem Namen auf der Berechtigungsseite den Berechtigungsschlüssel hinzufügt. Das dürfte das Nachschlagen erleichtern. Sie müssen es einem benutzerdefinierten Modul hinzufügen und "mymodule" durch den Namen dieses Moduls ersetzen.

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

Ich habe dieses JavaScript-Snippet erstellt , das mir dabei hilft. Ich habe es in Drupal 7 nur auf dem Shiny-Thema getestet .

Es gibt im Grunde den Computernamen aus, der vom ersten Kontrollkästchen dieses Namens in die erste Zelle unter dem Etikett übernommen wurde. Das Skript basiert auf jQuery, was unter Drupal 7 kein Problem sein sollte.

Normalerweise füge ich es in die Developer Tools-Konsole ein und führe es von dort aus aus. Ich könnte in Zukunft ein Lesezeichen dafür erstellen.

// 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
quelle
Und dank des Bookmarkify.it- Dienstes finden Sie das Bookmarklet hier .
Batandwa
Dies ist ein wirklich nützliches Werkzeug, ty!
DrCord
1
db_query("SELECT DISTINCT {permission} FROM role_permission");
emallove
quelle
1

Dies ist ein einfaches Modul, um es einfach zu machen: Access Arguments List

Grüße

Bilal
quelle
0

Schauen Sie einfach in ein Modul, Sie sehen die Maschinenberechtigungen unter / 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>)'; 
    }
}

Grüße

Yurii K.
quelle