J'ai créé un bloc par programmation mais je ne sais pas comment je peux lui attribuer l'accès par programmation. Comment puis-je y parvenir?
J'ai créé un bloc par programmation mais je ne sais pas comment je peux lui attribuer l'accès par programmation. Comment puis-je y parvenir?
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"
$query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
foreach (array_filter($form_state['values']['roles']) as $rid) {
$query->values(array(
'rid' => $rid,
'module' => $form_state['values']['module'],
'delta' => $form_state['values']['delta'],
));
}
$query->execute();
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.
Dans votre hook_block_info, vous pouvez essayer quelque chose comme:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
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.
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
$query = db_insert('block_role')
->fields(array(
'module' => 'MODULE_NAME',
'delta' => 'BLOCK_DELTA',
'rid' => 2, // Authenticated User
))
->execute();
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é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 :
function ModuleNAME_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.