J'utilise hook_node_access()
pour refuser aux utilisateurs l'accès à certains nœuds en fonction de critères personnalisés. Cependant, je ne veux pas que ce contenu s'affiche dans une vue qui le répertorie si l'utilisateur ne satisfait pas aux critères. Existe-t-il un moyen d'avoir des vues respectant les hook_node_access()
implémentations?
14
hook_node_access()
, il y a juste une chose à faire: modifier le code du module Views.hook_node_access()
implémentations ne sont pas respectées. Comme c'est "par conception", signaler une solution de contournement est très bien.Réponses:
J'ai eu la même question il y a quelque temps ici .
hook_node_access
n'est pas reconnu parviews
oumenus
. Il ne doit être utilisé que comme dernière ligne de défense.Un meilleur moyen de contrôler l'accès aux nœuds est de passer par
hook_node_access_records
ethook_node_grants
comme décrit ici et ici .la source
hook_node_access () uniquement est invoqué lors de la tentative d'affichage du nœud complet. Ce que vous devez faire est d'implémenter hook_node_access_records () et hook_node_grants () .
la source
Les vues utilisent SQL pour déterminer les nœuds à afficher. Malheureusement, pour des raisons de performances, il ne serait tout simplement pas possible pour Drupal d'effectuer un node_load sur tous les candidats potentiels, puis d'appeler hook_node_access sur chacun de ceux-ci. Imaginez une vue qui montre des milliers de nœuds (surtout lorsque vous utilisez un pager). Si la logique n'est pas effectuée en SQL, les pageurs auraient des fonctionnalités très inhabituelles, donc Drupal vous oblige à le faire comme indiqué précédemment en utilisant les enregistrements d'accès dans votre base de données.
Faire access_records est beaucoup plus de travail mais le fera fonctionner avec SQL. Je recommande donc d'utiliser un module node_access existant pour résoudre vos fonctionnalités autant que possible, car il sera probablement implémenté à l'aide des enregistrements d'accès et fonctionnera donc avec les vues.
Par la façon dont les enregistrements d'accès sont stockés dans la table node_access , comme indiqué ci-dessous: Grâce aux commentaires pour chaque colonne, vous pouvez comprendre leur objectif. Considérez le domaine comme le système utilisé pour l'accès aux nœuds et le gid comme le groupe au sein d'un domaine. Ce groupe peut avoir des autorisations d'affichage, de mise à jour et de suppression. En général, chaque module node_access définit un ou plusieurs domaines (parfois plusieurs modules node_access peuvent également fonctionner en parallèle). Un utilisateur a un ou plusieurs gids dans chacun des domaines.
Dans Drupal, toutes les requêtes qui ont la balise "node_access" auront automatiquement une logique spéciale ajoutée. Consultez la documentation pour en savoir plus sur le balisage. Cette logique spéciale rejoint la table "node_access" pour chaque domaine et ajoute la condition que lorsque le "gid" est égal à l'un des gids appliqués à un utilisateur, l'utilisateur dispose de l'autorisation appropriée.
L'ensemble de ce système permet à toutes les requêtes de gérer correctement node_access, même de compter les requêtes, etc. Il est très puissant mais a une courbe d'apprentissage plus élevée que le simple hook_node_access. Dans la mesure du possible, l'utilisation d'un module node_access existant peut vous éviter tout ce mal de tête.
la source