web-dev-qa-db-fra.com

Comment vérifier si un utilisateur a un accès en vue à un nœud, dans un fichier modèle?

Je travaille actuellement sur un LMS simple en D8 et j'ai déjà défini les types de contenu fondamentaux. Parmi eux se trouve un type de contenu appelé Course, qui peut être considéré comme du contenu "Premium", c'est-à-dire que tous les utilisateurs peuvent accéder aux champs qui contiennent des informations plus générales, mais les utilisateurs devront acheter un abonnement pour accéder au contenu complet .

Pour rendre cela possible sans aucun module Premium (qui, pour le moment, n'a pas été porté sur Drupal 8), j'ai créé une vue de grille simple et désactivé " Réécriture SQL ", qui fonctionne parfaitement jusqu'à présent. Pour afficher les nœuds dans cette vue, j'ai créé un nouveau mode d'affichage, appelé galerie, afin que les nœuds affichés puissent être stylisés dans un modèle .
Je voudrais appliquer différents styles CSS aux nœuds de la vue auxquels l'utilisateur peut accéder. Je ne sais pas si cela peut être fait dans la vue elle-même.

Quoi qu'il en soit, je pense actuellement à vérifier l'autorisation de vue dans node - course - gallery.html et je voudrais ajouter une classe à la balise article, si l'accès est autorisé.

Malheureusement, je n'arrive pas à trouver la bonne fonction pour cela. Je l'ai installé comme ceci:

{%
  set classes = [
    node.bundle|clean_class,
    node.isPromoted() ? 'is-promoted',
    node.isSticky() ? 'is-sticky',
    not node.isPublished() ? 'is-unpublished',
    view_mode ? view_mode|clean_class,
    user.hasPermission('view nodes') ? 'is-permitted',
    node.access('view') ? 'is-permitted',
    'clearfix',
  ]
%}

Ni user.hasPermission('view nodes') ? 'is-permitted' ni node.access('view') ? 'is-permitted' ne semblent avoir d'effet.

Avez-vous une idée?

4
Marcus C.

@Berdir, merci encore: Votre commentaire dans le dernier paragraphe m'a mis sur la bonne voie. J'ai maintenant résolu le problème comme suit:

Tout d'abord, j'ai étendu hook_preprocess_node() pour inclure

$node = $variables['elements']['#node'];
$check = $node->access('view');
$variables['viewaccess'] = $check;

(Toujours pas sûr, pourquoi $node = Node::load(1);, comme mentionné ici , ne fonctionne pas, mais c'est une autre histoire.) Ensuite, j'ai simplement utilisé

{%
  set classes = [
    node.bundle|clean_class,
    node.isPromoted() ? 'is-promoted',
    node.isSticky() ? 'is-sticky',
    not node.isPublished() ? 'is-unpublished',
    view_mode ? view_mode|clean_class,
    viewaccess ? 'is-permitted',
    'clearfix',
  ]
%}

au lieu de mon code d'origine. Marche parfaitement. Merci à tous, qui ont publié des commentaires et des réponses utiles.

2
Marcus C.

Pas vraiment une réponse, plutôt une suggestion pour une suggestion alternative où ce problème devrait exister, du moins pas exactement comme ça.

La façon dont j'ai géré des problèmes similaires auparavant (paywall pour les journaux dans mon cas) est pas d'utiliser le système d'accès au nœud pour cela. Dans mon cas, je l'ai fait en utilisant la logique dans le modèle/pré-processus ainsi qu'en changeant dynamiquement le mode d'affichage. Si vous pouvez le gérer champ par champ, vous pouvez également implémenter hook_entity_field_access () et refuser l'accès à la vue à ces champs spécifiques uniquement.

Cela dit, je m'attendrais à ce que la méthode ne soit pas autorisée à être appelée en raison du twig sandbox qui n'autorise que les appels de méthode is/get, mais je m'attendrais à ce qu'elle lance une exception.

Je suppose également qu'avec ma suggestion, vous aurez besoin d'un moyen de vérifier quelque chose dans le modèle, mais je le ferais simplement dans hook_preprocess_node () puis l'ajouter en tant que variable booléenne à $ variables.

3
Berdir