Запретить просмотр определенного типа контента

Аватар пользователя tyrk tyrk 9 мая 2011 в 9:44

Есть тип материала 'diary'. Нужно разрешить доступ к нему только автору ноды.

Создаем простой модуль 'diaryaccess', в котором выполняем хук hook_node_access.

<?php
/**
 * Implements hook_node_access().
 *  
 */
function diaryaccess_node_access($node$op$account) {
  
// If $node is a string, the node has not yet been created. We don't care
  // about that case.
  
if (is_string($node)) {
    return 
NODE_ACCESS_IGNORE;
  }
  if (
$node->type == 'diary' and $node->uid != $account->uid) {
    return 
NODE_ACCESS_DENY;
  }

  return 

NODE_ACCESS_IGNORE;
}
?>
0 Thanks

Комментарии

Аватар пользователя Alamir Alamir 9 мая 2011 в 20:09

А не проще через "Разрешение ролей"? "Edit own 'diary'", ну не дословно, но думаю понятно. А на остальной edit галку не ставить...

Аватар пользователя tyrk tyrk 9 мая 2011 в 20:11

Если вы заметили, в настройках доступа можно установить права на что угодно, кроме "view", т.е. просмотра. В моем случае нужно запретить именно просмотр.

Аватар пользователя Alamir Alamir 9 мая 2011 в 20:14

А, не учел:) Просто не было таких задач, можно извратиться с "content_permissions", но хуком проще:)

Аватар пользователя Orion76 Orion76 19 мая 2011 в 20:57

Не понял смысл первого IF

<?php
  
if (is_string($node)) {
    return 
NODE_ACCESS_IGNORE;
  }
?>

Если второй IF не сработает, все равно возвратиться NODE_ACCESS_IGNORE

Аватар пользователя kwas kwas 27 мая 2011 в 9:34

я вижу слово "модуль"
но нормальному человеку (нормальный - это я) не понятно, в какой именно файл это нужно вставить и как сделать, чтобы работало на конкретном сайте

Аватар пользователя tyrk tyrk 27 мая 2011 в 13:48

Создаете папку "diaryaccess".
В ней создаете файл diaryaccess.info с содержимым:

name = diaryaccess
description = Запрещает доступ к записям дневника всем кроме автора.
core = 7.x
files[] = diaryaccess.module

Создаете файл diaryaccess.module, в который помещаете приведенный в теме код.

Закачиваете папку в /sites/all/modules/

Заходите в раздел "Модули" и включаете модуль diaryaccess.

Аватар пользователя kwas kwas 28 мая 2011 в 0:15
tyrk wrote:

Создаете папку "diaryaccess"

Что-то не сработало. Сделал все в точности так. Только машинное имя "diary" поменял на свое. Материалы остались доступны всем...

Если обратиться по адресу самого материала, то выходит сообщение о запрете доступа, но во вьювсах материалы по автору не фильтруются и в списках таксономии тизеры тоже выходят по всем авторам без ограничений.
Т.е. модуль занимается не доступом к материалам, а фильтрацией вывода. Можно реализовать средствами Вьювс

Поставил дев-версию модуля "Content Access". Недоделанная. Вьювс контролирует, а через термины таксономии все показывает без ограничений.

Аватар пользователя iNFerNo iNFerNo 28 мая 2011 в 10:29

т.е. тизеры и вывод их где либо всегда доступны если вы их не отфлитруете... как то

Аватар пользователя iNFerNo iNFerNo 28 мая 2011 в 10:30

да и приведеный выше код должен лишь решать одну задачу... если просматривающий ноду не является ее авторам не показывать ноду... как бы все...

Аватар пользователя kwas kwas 29 мая 2011 в 11:09
"iNFerNo" wrote:

код должен лишь решать одну задачу

Однако, автор пишет:

"tyrk" wrote:

Есть тип материала 'diary'. Нужно разрешить доступ к нему только автору ноды.

А я о том и толкую, что код НЕ решает задачу доступа, он лишь фильтрует отображение при определенных условиях. А это две большие разницы.
Да и модуль для этого делать не нужно. Через вьювс должно решаться, dusov приводил ссылку.

Автору, однако, спасибо. Теперь я умею делать модули, правда, без админки.

Аватар пользователя iNFerNo iNFerNo 29 мая 2011 в 15:15

фильтровать вьюсом можно это понятно.

Т.е. чел написал код чтобы тизеры не видеть??? если он не является автором ноды?

Аватар пользователя milkovsky milkovsky 28 февраля 2012 в 16:24

Кто подскажет как скрыть определенные ноды во view для неавторизированного пользователя?

Аватар пользователя milkovsky milkovsky 29 февраля 2012 в 12:42
milkovsky wrote:

Кто подскажет как скрыть определенные ноды во view для неавторизированного пользователя?

Я сделал в ноде поле "скрывать для неавторизированных".
Но, тут загвоздка:
- если во view выставить фильтр по этому полю, то ноды скроются во view для всех пользователей(для авторизированных тоже). А авторизированные должны видить все ноды.

Возможные решения:
Делать две view в блоке на странице (1 - для неавторизированных со скрытыми нодами, 2 - для авторизированных со всеми нодами). Выставить разрешение на просмотр view по ролям.

Может есть другие варианты?

Аватар пользователя iNFerNo iNFerNo 29 февраля 2012 в 10:22

видимо в фильтарх исключить каждую. или метку делать длятаких нод в через скк и фильтровать по этому полю... ну и свое страницу для гостей делать во вьюхе

Аватар пользователя iNFerNo iNFerNo 29 февраля 2012 в 13:16

а в фильтрах третей вьюхе нельзя сделат ьелси роль = такой и если роль равна такойто + фильтр по ссккполю

Аватар пользователя milkovsky milkovsky 1 марта 2012 в 13:35
iNFerNo wrote:

а в фильтрах третей вьюхе нельзя сделат ьелси роль = такой и если роль равна такойто + фильтр по ссккполю

У меня Drupal7.
Да, в фильтрах можно указывать логическое условие И, ИЛИ.
Но в фильтрах нет фильтра по роли(хотел добавить relationship, но там нет связи с юзерами).
Во вьюхах есть только настройки доступа(Access), где указываются роли