Pourriez-vous développer votre question et afficher votre code?
Triskelion
Dans le code de bloc lui-même, vous pouvez rechercher l'utilisateur (global $ user) et vérifier son rôle en utilisant la méthode du lien. bywombats.com/blog/ryan/10-25-2007/…
user6614
Le module Panneaux a de très bons contrôles d'accès utilisant des régions, pas des blocs.
Louis
Réponses:
10
La définition du tableau "rôles" dans le tableau renvoyé par hook_block_info()ne fonctionne pas car:
Les rôles autorisés à voir un bloc et définis dans l'interface utilisateur sont enregistrés à partir de block_admin_configure_submit () dans la table "block_role"
Le code qui décide quels blocs doivent être affichés à l'utilisateur actuellement connecté est contenu dans block_block_list_alter () , qui est une implémentation de hook_block_list_alter () , et utilise uniquement le contenu de cette table
$result = db_query('SELECT module, delta, rid FROM {block_role}');foreach($result as $record){
$block_roles[$record->module][$record->delta][]= $record->rid;}foreach($blocks as $key => $block){if(!isset($block->theme)||!isset($block->status)|| $block->theme != $theme_key || $block->status !=1){// This block was added by a contrib module, leave it in the list.continue;}// If a block has no roles associated, it is displayed for every role.// For blocks with roles associated, if none of the user's roles matches// the settings from this block, remove it from the block list.if(isset($block_roles[$block->module][$block->delta])&&!array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))){// No match.
unset($blocks[$key]);continue;}// …}
Il n'y a pas d'autre fonction Drupal qui vérifie la propriété des rôles dans les données renvoyées hook_block_info(), ni le contenu de la table "block_role" fusionné avec ce qui est retourné par les hook_block_info()implémentations.
Vous pouvez vérifier que l'utilisateur a le rôle requis pour voir le bloc hook_block_view(), mais à ce stade, Drupal rend déjà le bloc; cela signifie que l'utilisateur verra toujours le titre du bloc, s'il a déjà été défini.
Ce que vous pouvez faire est d'implémenter hook_block_list_alter()pour supprimer les informations sur ce bloc lorsque l'utilisateur n'a pas le rôle requis.
Pour éviter toute confusion pour les utilisateurs qui administrent les blocs, je voudrais également modifier le formulaire utilisé pour modifier un bloc et désactiver le champ de formulaire utilisé pour définir les rôles qui peuvent voir ce bloc, car le module qui l'implémente va utiliser sa propre liste des rôles; le code minimal devrait au moins afficher un message sur les paramètres de rôle n'ayant aucun effet, mais je désactiverais également les éléments de formulaire pour les paramètres de rôle.
Étant donné que le module Bloc affiche déjà des champs de formulaire pour sélectionner les rôles qui verront un bloc, vous pouvez également simplement définir une valeur par défaut pour votre bloc et laisser les utilisateurs administrateurs le modifier si nécessaire.
Selon la vérification des rôles d'un utilisateur par rapport à la vérification des autorisations d'un utilisateur, la dernière est préférée, en particulier lorsque l'alternative serait de coder en dur une liste de rôles dans un module.
Comme le montre le module Bloquer, l'utilisation de l'autorisation n'est pas la seule alternative: un module peut avoir un paramètre pour décider quels rôles sont autorisés à voir quelque chose.
De toute évidence, il ne vaut pas toujours la peine d'avoir un cadre pour lequel les rôles sont autorisés à faire quelque chose. J'imagine également ce que signifierait pour les utilisateurs administrateurs si 10 modules auraient leurs propres paramètres pour lesquels les rôles sont autorisés à faire quelque chose, au lieu d'utiliser des autorisations, et permettant aux utilisateurs administrateurs d'utiliser une seule page pour les définir.
Eh bien, je devrai évidemment choisir celle-ci comme la réponse la plus appropriée. Merci pour l'explication détaillée car cela aide vraiment à comprendre comment les blocs Drupal fonctionnent en arrière-plan.
user5013
1
Dans votre hook_block_info, vous pouvez essayer quelque chose comme:
Cela semble être le meilleur moyen de l'implémenter en utilisant une approche programmatique lorsque vous définissez les rôles auxquels vous avez accès, puis laissez Drupal déterminer si un utilisateur peut y accéder ou non. Ai-je raté un inconvénient de cette approche?
user5013
Si vous devez le faire par programme, oui. Aucun inconvénient. Cependant, je suppose qu'il devrait y avoir un très bon cas d'utilisation contre simplement aller dans / admin / structure / block et attribuer des rôles au bloc.
Triskelion
Le cas d'utilisation serait de faire automatiquement la configuration pour l'utilisateur afin qu'il n'ait pas à le faire. Strictement un problème de commodité. Une fois défini, ils pourraient alors le changer pour ce qu'ils veulent s'il ne correspond pas à leurs besoins particuliers.
user5013
1
Cela ne fonctionne pas; voir ma réponse pour savoir pourquoi ce n'est pas le cas.
kiamlaluno
0
En supposant que vous faites vous-même les blocs avec hook_block_info (), vous pouvez simplement faire user_access () dans votre fonction hook_block_view (). Consultez les docs api car ils en ont un exemple.
Oui, j'aurais dû penser à utiliser user_access. Totalement glissé mon esprit - D'oh. Je pense à utiliser l'accès aux rôles, mais l'accès aux autorisations pourrait peut-être être une meilleure solution.
user5013
0
C'est impossible dans hook_block_info (), mais vous pouvez utiliser cette requête pour y parvenir. Modifiez MODULE_NAME, BLOCK_DELTA et RID en conséquence
Dans hook_block_view, vous pouvez utiliser global $userpour obtenir des informations sur l'utilisateur, puis en fonction du rôle de l'utilisateur, vous pouvez attribuer différents block['subject']et block['content']même n'attribuer aucun sujet et contenu à bloquer s'il va être invisible pour ce rôle. Voici un exemple :
functionModuleNAME_block_view($delta =''){switch($delta){case'Your_BLOCK':Global $user;if($user->uid !='0'){
$block['subject']='SUBJECT';
$block['content']='SOME CONTENT OR A FUNCTION FOR BLOCK';}break;}return $block;}
en utilisant ce code, les utilisateurs authentifiés (pas les invités) verront le bloc devenir visible pour les utilisateurs authentifiés.
Réponses:
La définition du tableau "rôles" dans le tableau renvoyé par
hook_block_info()
ne fonctionne pas car:Les rôles autorisés à voir un bloc et définis dans l'interface utilisateur sont enregistrés à partir de block_admin_configure_submit () dans la table "block_role"
Le code qui décide quels blocs doivent être affichés à l'utilisateur actuellement connecté est contenu dans block_block_list_alter () , qui est une implémentation de hook_block_list_alter () , et utilise uniquement le contenu de cette table
Il n'y a pas d'autre fonction Drupal qui vérifie la propriété des rôles dans les données renvoyées
hook_block_info()
, ni le contenu de la table "block_role" fusionné avec ce qui est retourné par leshook_block_info()
implémentations.Vous pouvez vérifier que l'utilisateur a le rôle requis pour voir le bloc
hook_block_view()
, mais à ce stade, Drupal rend déjà le bloc; cela signifie que l'utilisateur verra toujours le titre du bloc, s'il a déjà été défini.Ce que vous pouvez faire est d'implémenter
hook_block_list_alter()
pour supprimer les informations sur ce bloc lorsque l'utilisateur n'a pas le rôle requis.Pour éviter toute confusion pour les utilisateurs qui administrent les blocs, je voudrais également modifier le formulaire utilisé pour modifier un bloc et désactiver le champ de formulaire utilisé pour définir les rôles qui peuvent voir ce bloc, car le module qui l'implémente va utiliser sa propre liste des rôles; le code minimal devrait au moins afficher un message sur les paramètres de rôle n'ayant aucun effet, mais je désactiverais également les éléments de formulaire pour les paramètres de rôle.
Étant donné que le module Bloc affiche déjà des champs de formulaire pour sélectionner les rôles qui verront un bloc, vous pouvez également simplement définir une valeur par défaut pour votre bloc et laisser les utilisateurs administrateurs le modifier si nécessaire.
Selon la vérification des rôles d'un utilisateur par rapport à la vérification des autorisations d'un utilisateur, la dernière est préférée, en particulier lorsque l'alternative serait de coder en dur une liste de rôles dans un module.
Comme le montre le module Bloquer, l'utilisation de l'autorisation n'est pas la seule alternative: un module peut avoir un paramètre pour décider quels rôles sont autorisés à voir quelque chose.
De toute évidence, il ne vaut pas toujours la peine d'avoir un cadre pour lequel les rôles sont autorisés à faire quelque chose. J'imagine également ce que signifierait pour les utilisateurs administrateurs si 10 modules auraient leurs propres paramètres pour lesquels les rôles sont autorisés à faire quelque chose, au lieu d'utiliser des autorisations, et permettant aux utilisateurs administrateurs d'utiliser une seule page pour les définir.
la source
Dans votre hook_block_info, vous pouvez essayer quelque chose comme:
la source
En supposant que vous faites vous-même les blocs avec hook_block_info (), vous pouvez simplement faire user_access () dans votre fonction hook_block_view (). Consultez les docs api car ils en ont un exemple.
la source
C'est impossible dans hook_block_info (), mais vous pouvez utiliser cette requête pour y parvenir. Modifiez MODULE_NAME, BLOCK_DELTA et RID en conséquence
la source
Dans hook_block_view, vous pouvez utiliser
global $user
pour obtenir des informations sur l'utilisateur, puis en fonction du rôle de l'utilisateur, vous pouvez attribuer différentsblock['subject']
etblock['content']
même n'attribuer aucun sujet et contenu à bloquer s'il va être invisible pour ce rôle. Voici un exemple :en utilisant ce code, les utilisateurs authentifiés (pas les invités) verront le bloc devenir visible pour les utilisateurs authentifiés.
la source