Autoriser la vue d'un bloc en fonction d'un champ CCK de Content Profile

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Je cherche à restreindre la vue d'un bloc, non en fonction du rôle d'un utilisateur, mais en fonction du 'type de structure' auquel il appartient.

Je m'explique...

Sur mon site, les utilisateurs, quelque soit leur rôle, appartiennent à un 'type de Structure' particulier (institutionnel,entreprise,...). Ils renseignent cette information par un champ CCK sur leur page de profil customisée par Content Profile.

Je voudrais maintenant afficher (ou non) certains blocs (créés avec views) en fonction de la valeur qu'ils ont renseignée dans ce champ.

Une petite idée ? Un conseil ?

Merci d'avance,
Mat

Version de Drupal : 

Par les templates, tu peux coder assez simplement l'affichage de ta vue en fonction de la valeur du champ cck .

Il y a probablement une solution plus élégante en utilisant les contextes mais là, je ne saurais t'aider.

D'après ce que j'ai compris de 'Context', il permet de gérer l'affichage des blocs en fonction de la page où l'on est et non en fonction de "qui l'on est" (au sens large dans mon cas).

Je voudrais que cet affichage soit conditionné par la valeur qu'a soumis l'utilisateur dans le champ CCK 'type de Structure'.

Et pour les templates de views, as-tu un lien qui serait intéressant dans mon cas? Je suis en train de me taper le 'Theming guide' de Views 2 et je n'ai pas l'impression qu'il réponde à ma question.

Peut-être dois-je gérer cela par une fonction qui override une fonction d'affichage du module 'Block' dans mon fichier template.php ?

Merci

Tu peux conditionner l'affichage d'un bloc en PHP dans la config du bloc.

L'idéal serait donc de conditionner ici l'affichage du bloc. Reste à savoir s'il y a une fonction spécifique à Content Profile qui te permettrait d'obtenir la valeur facilement, sans appeler tous les paramètres de l'utilisateur avec user_load().

Au pire, il est toujour possible de faire un appel "manuel" avec db_result() et db_query().

Salut,

Pour ceux que ça intéresse je poste ma solution, même si je trouve que c'est un peu du bricolage car :

  • j'ai suivi le conseil de emerya en conditionnant l'affichage des blocs dans la config des blocs : n'y a-t-il pas plus élégant que de rentrer du PHP dans un input text ? (rentrer du code dans une BD c'est le maaaal...)
  • vu le nombre d'étape que je prends pour récupérer la valeur du champ, il doit y avoir plus simple...

L'exemple que je montre permet de conditionner l'affichage d'un bloc en fonction :

  • du statut de l'utilisateur courant : si non identifié, je n'affiche pas.
  • du rôle de l'utilisateur : si 'webmaster' j'affiche.
  • de la valeur du terme de taxonomie entré par l'utilisateur sur sa page profil (si il fait partie d'une structure 'Institutionnel', j'affiche).

<?php
   
global $user;
  
  
// Récupérer l'ID utilisateur courant
 
$user_uid = $user->uid;
  
   
// Si l'utilisateur est non authentifié
   
if($user_uid == '0'){return false;}

    // Si l'utilisateur a le rôle 'webmaster', return true
   
foreach($user->roles as $role){
        if(
$role == 'webmaster'){return true;}
    }

   // SINON
  
   // Récupérer l'ID de la node correspondant au profil de l'utilisateur
   
$query = "SELECT n.nid FROM {node} n  INNER JOIN {users} users ON n.uid = users.uid WHERE n.type in ('profil') AND users.uid={$user_uid}";
 
$result = db_query($query);
   
$nid = db_result($result);
 
  
// Récupérer l'ID du terme de taxonomie qui réfère au type de structure
  
$query2 = "SELECT c.field_type_structure_value FROM {content_field_type_structure} c WHERE c.nid ={$nid} AND c.delta=0";
 
$result2 = db_query($query2);
 
$type_structure_value = db_result($result2);

  // Bloc Promotion : return TRUE pour 74 (Institutionnels)
 
if($type_structure_value == '74'){return true;}else{return false;}
  
?>

Voilou.

Le problème c'est que je dois faire ça pour chaque bloc qui conditionne l'affichage à la valeur de ce champ CCK. Et l'aspect dynamique n'est plus conservé si je modifie le vocabulaire (ajout/retrait de termes).

APPEL AUX DEVELOPPEURS :
2 questions donc :

  • est-il possible de créer une fonction du type 'afficher_blocs_a_ma_maniere()' dans le fichier template.php ? Et dois-je utiliser des hooks ?
  • Dois-je plutôt développer un module pour en faire une version plus stable ?
  • Y-a-t-il une solution plus simple à laquelle je n'avais pas pensé ?

Mat

Je pense qu'il faut alors te poser la question de savoir s'il est opportun de recourir à taxonomy pour le classement qui te concerne.

Compte tenu du fait que tes utilisateurs sont des utilisateurs enregistrés, il me semble préférable d'aller dans le sens de l'architecture de Drupal et d'utiliser les groupes pour "classer" tes utilisateurs plutôt que les taxonomies.

En effet, la difficulté à laquelle tu te heurtes actuellement va inévitablement se reproduire pour toute fonctionnalité spécifique à un type d'utilisateur que tu souhaitera implémenter(car ce sont finalement des types d'utilisateurs différents qui auront accès à des fonctionnalités différentes).

En fait, j'ai déjà des rôles définis pour ce site : authentifié, expert et webmaster. Ils ont des droits différents pour l'écriture des types de contenus et le workflow de publication.

Mais chaque utilisateur fait aussi partie d'une Structure qui, elle, appartient à un groupe Institutionnel (avec ses sous-groupes) ou Entreprise (et ses sous-groupes).

Et je voudrais afficher les blocs en fonction de la nature de la Structure à laquelle l'utilisateur appartient.

Qu'appelles-tu les "groupes" ? Tu parles de "Organic Group" ?

Merci

Mat