web-dev-qa-db-fra.com

Filtrer une vue en fonction des rôles de l'utilisateur actuel?

En utilisant Drupal 7, Views 3 et le module de référence Node, j'utilise une vue pour remplir un champ de référence de nœud sur un type de contenu personnalisé. (Donc c'est une vue du type d'affichage "Référence".)

Je souhaite filtrer cette vue pour afficher (et autoriser les utilisateurs à sélectionner) uniquement:

  1. contenu publié (OK)
  2. contenu d'un certain type (OK)
  3. seuls les nœuds créés par l'utilisateur actuel (OK)
  4. OU si l'utilisateur actuel est administrateur ou un autre rôle, contournez le filtre précédent (3) et affichez tous les nœuds (mais respectez toujours les filtres 1 et 2) (pas OK)

Les filtres 1 et 2 sont toujours obligatoires; alors soit le filtre 3 OR 4 doit également être obligatoire. Je sais que je peux réorganiser les filtres en groupes de filtres pour que cela fonctionne. Le problème est que je ne peux pas trouver un moyen de construire le filtre 4.

Pour le filtre 3, j'ai dû introduire une relation de type "Content: Author", qui a fait apparaître de nombreux nouveaux filtres, y compris "User: Current" que j'ai utilisé pour le filtre 3 (node ​​author == current user).

Pour le filtre 4, je dois filtrer en fonction du rôle de l'actuel tilisateur (pas auteur), et je ne trouve pas comment le faire.

Dans la liste des filtres, un nouveau filtre "Utilisateur: Rôles" est disponible, mais il ne fait référence qu'à la relation "Contenu: Auteur", il ne vérifie donc que les rôles de auteur du nœud. Ce n'est pas ce dont j'ai besoin: je dois vérifier les rôles de tilisateur actuel.

Je suppose que je dois ajouter une nouvelle relation pour importer les données utilisateur actuelles (quelque chose comme "Utilisateur: actuel"), puis filtrer ces données, mais je ne trouve pas cela dans l'écran Ajouter une relation.

Une idée de comment faire ça?

6
s427

Après @ suggestion de Jimajamma , voici ce que j'ai utilisé. J'ai légèrement adapté son code pour Drupal 7 et pour permettre à d'autres rôles que les administrateurs un accès complet aux résultats.

Dans la vue, ajoutez un filtre contextuel sur Author: Uid Et utilisez les paramètres suivants:

LORSQUE LA VALEUR DU FILTRE IS NON DISPONIBLE:

  • Fournir une valeur par défaut
  • Tapez: PHP Code

Utilisez le code suivant:

global $user;

if (
    in_array('administrator', $user->roles) || 
    in_array('editor', $user->roles)
)
{return -1;}
else
{return $user->uid;}

LORSQUE LA VALEUR DU FILTRE IS DISPONIBLE OR UN DÉFAUT IS FOURNI

  • Spécifiez les critères de validation
  • Validateur: PHP Code

Utilisez le code suivant:

if ($argument == -1) 
{return FALSE;}
else
{return TRUE;}
  • Action à entreprendre si la valeur du filtre ne valide pas: afficher tous les résultats pour le champ spécifié (c'est ce qui donnera aux administrateurs l'accès à tous les résultats)

Et c'est tout!

Remarques:

Par rapport à mes paramètres initiaux, la relation (Content: Author) N'est plus nécessaire; ni le filtre "Auteur" (qui a été introduit par la relation de toute façon).

Apparemment, pour Drupal 6 la condition dans le premier PHP extrait devrait plutôt être if (in_array('super user', array_values($user->roles)))).

8
s427

Vous devez ajouter un filtre contextuel pour filtrer en fonction de l'utilisateur actuellement connecté.

  1. Ajouter un filtre contextuel pour "Utilisateur: Uid"
  2. Sélectionnez "Fournir une valeur par défaut"
  3. Choisissez le type: "ID utilisateur de l'utilisateur connecté"

Vous devrez également cloner un nouvel affichage de vue pour afficher tous les nœuds pour des rôles spécifiques, configurés par Paramètres de page: Accès> Rôle. Choisissez ensuite Administrateur et tout autre rôle qui devrait voir tous les nœuds.

Vous ne pouvez pas OR un filtre comme un tri, et vous afficheriez la vue de deux manières différentes avec du contenu filtré et tout le contenu, donc je créerais deux affichages de cette vue.

2
pxwise