web-dev-qa-db-fra.com

Comment attribuer par programme l'accès à un bloc?

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?

10
user5013

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 ce tableau

    $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é rôles dans les données renvoyées par hook_block_info(), ni le contenu de la table "block_role" fusionné avec ce qui est retourné par les implémentations hook_block_info().

Vous pouvez vérifier que l'utilisateur a le rôle requis pour voir le bloc dans hook_block_view(), mais à ce stade Drupal rend déjà le bloc; cela signifie que l'utilisateur verra toujours le le titre du bloc, s'il a déjà été défini.

Ce que vous pouvez faire consiste à 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 aux 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 pouvant voir ce bloc, car le module qui l'implémente va d'utiliser sa propre liste de 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.

screenshot

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 Bloc, 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 n'est pas toujours utile 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.

10
kiamlaluno

Dans votre hook_block_info, vous pouvez essayer quelque chose comme:

$blocks['myblock'] = array(
   ...
   'roles' => array(
      'administrator' => '3',
      'authenticated user' => '2',
   )
1
Triskelion

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'] ou même n'attribuez 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.

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

$query = db_insert('block_role')
  ->fields(array(
    'module' => 'MODULE_NAME', 
    'delta' => 'BLOCK_DELTA', 
    'rid' => 2, // Authenticated User
  ))
  ->execute();
0
Paul Bönisch

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 api docs car ils en ont un exemple.

0
jdwfly