hook_permission Drupal 7 : permissions d’accès pour différents rôles
Lors des leçons précédentes, nous avons affiché des pages et des blocs à différents endroits, en utilisant aussi les propriétés 'access arguments' et 'access callback' pour définir des restrictions d’accès aux pages. Dans cette leçon, nous allons créer une possibilité d’édition plus flexible des droits d’accès aux opérations via des pages d’administration. Pour cela, nous utiliserons le hook_permission() (dans Drupal 6, c’était hook_perm()).
hook_permission()
Ce hook définit les permissions pour les utilisateurs.
Il permet à votre module d’ajouter des permissions, que les utilisateurs pourront sélectionner sur la page des permissions. Le hook est aussi utilisé pour contrôler l’accès total ou partiel aux actions (actions) effectuées par le module.
Les permissions sont vérifiées via la fonction user_access().
Valeurs retournées
Un tableau dont les clés sont les noms des permissions, et les valeurs sont des tableaux associatifs contenant les paires clé-valeur suivantes :
- title : nom lisible de la permission, affiché sur la page des permissions. Cette valeur doit être entourée de la fonction t() pour permettre la traduction.
- description (optionnel) : description de ce que fait la permission, également à entourer de t() pour traduction.
- restrict access (optionnel) : booléen (TRUE ou FALSE) indiquant que l’administrateur devrait limiter l’accès à cette permission aux utilisateurs de confiance seulement. Cette option est à utiliser pour les permissions sensibles afin d’éviter des failles de sécurité (par exemple : gérer les filtres d’entrée ou contrôle total sur les nœuds). Si TRUE, un message d’erreur standard défini dans user_admin_permissions() sera affiché via theme_user_permission_description() sur la page d’administration. Par défaut, cette valeur est FALSE.
- warning (optionnel) : affiche un message d’erreur traduisible personnalisé pour cette permission sur la page d’administration. Cela remplace le message généré automatiquement par restrict access. À utiliser avec parcimonie pour que toutes les permissions aient un aspect cohérent et ressemblent aux autres messages d’alerte. Utilisez plutôt description pour ajouter des informations détaillées.
Voici comment ajouter ce hook au code de la leçon précédente :
function sitemade_permission(){ return array( 'view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); } function sitemade_menu(){ $items = array(); // initialisation du tableau des menus $items['admin/config/content/page_example'] = array( // ajout de la page à ce chemin 'title' => 'Exemple de page', // titre de la page 'description' => 'Page simple', // description de la page 'page callback' => '_page_example', // fonction qui retourne le contenu 'access arguments' => array('view page example'), // permissions d’accès définies dans hook_permission ); return $items; // retourne la liste des pages } function _page_example($content = NULL) { $content = ''; // initialise la variable de contenu vide $query = db_select('node_revision', 'n'); // sélectionne la table node_revision contenant la révision courante $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // joint la table field_revision_body contenant le corps $query->innerJoin('node', 'd', 'n.nid = d.nid'); // joint la table node contenant le titre $query->fields('n', array('title'), array('nid'), array('vid')); // sélectionne les champs $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); // filtre par type de contenu $query->orderBy('n.timestamp', 'DESC'); // trie par date décroissante $query->range(0, 10); // limite à 10 résultats $result = $query->execute(); // exécute la requête while($nodes = $result->fetch()){ // traite les résultats $content .= '<h3>' . $nodes->title . '</h3>'; // affiche le titre $content .= $nodes->body_value; // affiche le corps } return $content; // retourne le contenu }
Maintenant, une nouvelle permission apparaît sur la page des permissions : admin/people/permissions :
Attribuez cette permission uniquement à l’administrateur pour que les utilisateurs classiques ne puissent pas accéder à cette page. Dès lors, en allant sur admin/config/content/page_example, Drupal renverra une erreur 403 aux utilisateurs non autorisés.
Dans la prochaine leçon, nous créerons une page d’administration avec un formulaire de configuration pour notre site, en utilisant le Drupal Forms API.