Estou usando hook_node_access()
para negar aos usuários acesso a alguns nós com base em critérios personalizados. No entanto, não quero que esse conteúdo seja exibido em uma exibição que a lista se o usuário não passar nos critérios. Existe alguma maneira de ter visualizações respeitando hook_node_access()
implementações?
14
hook_node_access()
, basta executar uma ação: alterar o código do módulo Views.hook_node_access()
implementações não são respeitadas. Como é "por design", relatar uma solução alternativa é bom.Respostas:
Eu tive a mesma pergunta há um tempo aqui .
hook_node_access
não é reconhecido porviews
oumenus
. Só deve ser usado como a última linha de defesa.Uma maneira melhor de controlar o acesso ao nó é através
hook_node_access_records
ehook_node_grants
conforme descrito aqui e aqui .fonte
hook_node_access () é invocado apenas ao tentar visualizar o nó completo. O que você precisa fazer é implementar hook_node_access_records () e hook_node_grants () .
fonte
O Views usa SQL determina os nós a serem exibidos. Infelizmente, por razões de desempenho, simplesmente não seria viável para o Drupal executar uma carga de nó em todos os possíveis candidatos e, em seguida, chamar hook_node_access em cada um deles. Imagine uma exibição que mostre milhares de nós (especialmente ao usar um pager). Se a lógica não for feita no SQL, os pagers teriam uma funcionalidade muito incomum, portanto, o Drupal o força a fazê-lo como o rik mencionado, usando registros de acesso em seu banco de dados.
Tornar access_records é uma quantidade razoável de trabalho, mas fará com que funcione com o SQL. Portanto, recomendo usar um módulo node_access existente para resolver sua funcionalidade sempre que possível, porque provavelmente será implementado usando registros de acesso e, portanto, funcionará com visualizações.
A propósito, os registros de acesso são armazenados na tabela node_access, conforme mostrado abaixo: Através dos comentários de cada coluna, você pode entender o propósito deles. Pense na região como o sistema usado para acesso ao nó e o gid como o grupo em uma região. Esse grupo pode ter permissões de visualização, atualização e exclusão. Em geral, cada módulo node_access define uma ou mais regiões (às vezes vários módulos node_access também podem funcionar em paralelo). Um usuário tem um ou mais gids em cada uma das regiões.
No Drupal, todas as consultas que possuem a tag "node_access" terão automaticamente alguma lógica especial adicionada. Consulte a documentação para saber mais sobre a marcação. Essa lógica especial une a tabela "node_access" para cada região e adiciona a condição de que onde o "gid" é igual a um dos gids aplicados a um usuário, o usuário tem a permissão apropriada.
Todo esse sistema permite que todas as consultas gerenciem adequadamente o node_access, contem consultas, etc. É muito poderoso, mas possui uma curva de aprendizado mais alta que apenas o hook_node_access simples. Sempre que possível, o uso de um módulo node_access existente pode economizar toda essa dor de cabeça.
fonte