Вы здесь

Хитрый фильтр по полю юзера/роли для Views 3.x (содержимое)

0

Доброго времени суток! Есть вьюха, отдает поля материала неформатированным списком. Есть самопальный модуль, подтягивающий поля профиля юзера со стороннего ресурса, сохраняющий юзера в друпале с полученными данными и сразу аутентифицирующий юзера. Сейчас у меня весь самопал, связанный с юзерами в hook_view_pre_view(), всё хорошо. Но вот понадобилось отдавать материалы исходя из роли юзера, которая подтягивается со стороннего ресурса. Я могу ее сохранить как поле профиля, могу присвоить роль в друпале, это не вопрос. Вопрос в том, как настроить фильтрацию материалов, исходя из роли юзера. Разрешение на просмотр материалов сделаю полем в материале (checkbox'ы), то есть есть материал Y. Внутри него поле 'Видно юзерам, обладающих ролью', в этом поле:

  • V роль кот
  • V роль бегемот
  • X роль абракадабра

V - стоит галка, X - не стоит. Таким образом, если у юзера роль = кот || бегемот, вьюха для него отдает контент. если абракадабра —он материал в выводе не наблюдает (но наблюдает другие материалы, где для него стоит V)

Средставами UI сделать это невозможно, насколько я соображаю. Надумал варианты:

  1. Views API -- особо с ним не сталкивался, подскажите, какие хуки вы бы использовали для решения подобной задачи, например в _pre_render мне доступ не получить к объекту вьюхи (не знаю из-за чего), возможно hook_views_post_build?
  2. сделать под каждую роль три вьюхи c обычным php фильтром, код по юзерам перебросить в свою функцию, в hook_menu её привязать к урлу и далее в тупую редиректить на нужную вьюху. топорно и фу
  3. избавиться от views и написать вывод руками

склоняюсь к варианту #1, подскажите по хукам, если делали подобное.

Версия Drupal: 
7.x
Связанные проекты: 
Views
Вопрос задан 03.04.2016 - 01:25

Ответы

0

Сделайте контекстный фильтр по полю материала, которое содержит разрешения на просмотр. Никаких значений по умолчанию не передавайте, если нет аргумента для фильтра, вьюха должна быть пустая.
Используйте hook_views_pre_build, в нем программно задайте аргумент для контекстного фильтра

$global $user;
$roles = my_module_get_user_roles($user); // returns array
$view->set_arguments(array(implode('+', $roles)))
Ответ дан 03.04.2016 - 15:25