Я использую, hook_node_access()
чтобы запретить пользователям доступ к некоторым узлам на основе пользовательских критериев. Однако я не хочу, чтобы это содержимое отображалось в представлении, в котором он отображается, если пользователь не соответствует критериям. Есть ли способ заставить представления уважать hook_node_access()
реализации?
14
hook_node_access()
помощью, то нужно просто сделать следующее: изменить код модуля Views.hook_node_access()
реализации не соблюдаются. Так как это «по замыслу», отчетность об обходных путях - это хорошо.Ответы:
У меня был тот же вопрос некоторое время назад здесь .
hook_node_access
не распознаетсяviews
илиmenus
. Он должен использоваться только в качестве последней линии защиты.Лучший способ управления доступом к узлу - сквозной
hook_node_access_records
иhook_node_grants
описанный здесь и здесь .источник
Только hook_node_access () вызывается при попытке просмотра полного узла. Что вам нужно сделать, это реализовать hook_node_access_records () и hook_node_grants () .
источник
Представления используют SQL для определения узлов для отображения. К сожалению, из соображений производительности Drupal просто не сможет выполнить node_load для всех потенциальных кандидатов, а затем вызвать hook_node_access для каждого из них. Представьте себе представление, которое показывает тысячи узлов (особенно при использовании пейджера). Если логика не реализована в SQL, то пейджеры будут иметь очень необычную функциональность, поэтому Drupal заставляет вас делать это, как упоминалось ранее, используя записи доступа в вашей базе данных.
Создание access_records довольно много работы, но заставит его работать с SQL. Поэтому я рекомендую использовать существующий модуль node_access для решения вашей функциональности везде, где это возможно, потому что он, вероятно, будет реализован с использованием записей доступа и, следовательно, будет работать с представлениями.
Между прочим, записи доступа хранятся в таблице node_access таблицы, как показано ниже: Посредством комментариев для каждого столбца вы можете получить представление об их назначении. Представьте, что сфера - это система, используемая для доступа к узлам, а гид - как группа внутри области. Эта группа может иметь права просмотра, обновления и удаления. В общем, каждый модуль node_access определяет одну или несколько областей (иногда несколько модулей node_access также могут работать параллельно). У пользователя есть один или несколько гидов в каждой из областей.
В Drupal все запросы, имеющие тег «node_access», автоматически будут иметь некоторую специальную логику. См. Документацию, чтобы узнать больше о маркировке. Эта специальная логика объединяет таблицу «node_access» для каждой области и добавляет условие, что, когда «gid» равен одному из gid, примененных к пользователю, пользователь имеет соответствующие разрешения.
Вся эта система позволяет всем запросам правильно обрабатывать node_access, даже считать запросы и т. Д. Она очень мощная, но имеет более высокую кривую обучения, чем просто hook_node_access. Когда это возможно, использование существующего модуля node_access может избавить вас от всей этой головной боли.
источник