Доброго времени суток! Есть вьюха, отдает поля материала неформатированным списком. Есть самопальный модуль, подтягивающий поля профиля юзера со стороннего ресурса, сохраняющий юзера в друпале с полученными данными и сразу аутентифицирующий юзера. Сейчас у меня весь самопал, связанный с юзерами в hook_view_pre_view(), всё хорошо. Но вот понадобилось отдавать материалы исходя из роли юзера, которая подтягивается со стороннего ресурса. Я могу ее сохранить как поле профиля, могу присвоить роль в друпале, это не вопрос. Вопрос в том, как настроить фильтрацию материалов, исходя из роли юзера. Разрешение на просмотр материалов сделаю полем в материале (checkbox'ы), то есть есть материал Y. Внутри него поле 'Видно юзерам, обладающих ролью', в этом поле:
- V роль кот
- V роль бегемот
- X роль абракадабра
V - стоит галка, X - не стоит. Таким образом, если у юзера роль = кот || бегемот, вьюха для него отдает контент. если абракадабра —он материал в выводе не наблюдает (но наблюдает другие материалы, где для него стоит V)
Средставами UI сделать это невозможно, насколько я соображаю. Надумал варианты:
- Views API -- особо с ним не сталкивался, подскажите, какие хуки вы бы использовали для решения подобной задачи, например в _pre_render мне доступ не получить к объекту вьюхи (не знаю из-за чего), возможно hook_views_post_build?
- сделать под каждую роль три вьюхи c обычным php фильтром, код по юзерам перебросить в свою функцию, в hook_menu её привязать к урлу и далее в тупую редиректить на нужную вьюху. топорно и фу
- избавиться от views и написать вывод руками
склоняюсь к варианту #1, подскажите по хукам, если делали подобное.
Ответы
Сделайте контекстный фильтр по полю материала, которое содержит разрешения на просмотр. Никаких значений по умолчанию не передавайте, если нет аргумента для фильтра, вьюха должна быть пустая.
Используйте hook_views_pre_build, в нем программно задайте аргумент для контекстного фильтра
$global $user;
$roles = my_module_get_user_roles($user); // returns array
$view->set_arguments(array(implode('+', $roles)))
попробую, спасибо!