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


10

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?


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"

    $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.

capture d'écran

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:

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

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

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

0

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 :

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.