Estoy utilizando hook_node_access()
para denegar a los usuarios el acceso a algunos nodos según un criterio personalizado. Sin embargo, no quiero que este contenido aparezca en una vista que lo enumere si el usuario no pasa los criterios. ¿Hay alguna forma de que las vistas respeten las hook_node_access()
implementaciones?
14
hook_node_access()
, solo hay una cosa que debe hacerse: alterar el código del módulo de Vistas.hook_node_access()
no se respetan las implementaciones. Como es "por diseño", informar una solución alternativa está bien.Respuestas:
Tuve la misma pregunta hace un tiempo aquí .
hook_node_access
no es reconocido porviews
omenus
. Solo debe usarse como la última línea de defensa.Una mejor manera de controlar el acceso a los nodos es mediante
hook_node_access_records
yhook_node_grants
como se describe aquí y aquí .fuente
hook_node_access () solo se invoca cuando se intenta ver el nodo completo. Lo que debe hacer es implementar hook_node_access_records () y hook_node_grants () .
fuente
Las vistas usan SQL para determinar los nodos a mostrar. Lamentablemente, por razones de rendimiento, simplemente no sería factible que Drupal realice una carga de nodo en todos los candidatos potenciales y luego llame a hook_node_access en cada uno de ellos. Imagine una vista que muestra miles de nodos (especialmente cuando se usa un buscapersonas). Si la lógica no se realiza en SQL, entonces los buscapersonas tendrían una funcionalidad muy inusual, por lo que Drupal lo obliga a hacerlo como se menciona utilizando los registros de acceso en su base de datos.
Hacer que access_records sea mucho más trabajo pero hará que funcione con SQL. Por lo tanto, recomiendo usar un módulo node_access existente para resolver su funcionalidad siempre que sea posible porque probablemente se implementará utilizando registros de acceso y, por lo tanto, funcionará con vistas.
Por cierto, los registros de acceso se almacenan en la tabla tabla_acceso_nodo como se ve a continuación: a través de los comentarios para cada columna, puede comprender su propósito. Piense en el reino como el sistema utilizado para el acceso a los nodos y el gid como el grupo dentro de un reino. Ese grupo puede tener permisos para ver, actualizar y eliminar. En general, cada módulo node_access define uno o más reinos (a veces, varios módulos node_access también pueden funcionar en paralelo). Un usuario tiene uno o más gids en cada uno de los reinos.
En Drupal, todas las consultas que tengan la etiqueta "node_access" tendrán automáticamente alguna lógica especial agregada. Consulte la documentación para obtener más información sobre el etiquetado. Esta lógica especial se une a la tabla "node_access" para cada reino y agrega la condición de que donde el "gid" es igual a uno de los gid aplicados a un usuario, el usuario tiene el permiso apropiado.
Todo este sistema permite que todas las consultas manejen correctamente el nodo_acceso, incluso contar consultas, etc. Es muy potente pero tiene una curva de aprendizaje más alta que el simple hook_node_access. Siempre que sea posible, usar un módulo node_access existente puede ahorrarle todo este dolor de cabeza.
fuente