Drupal7 - 根据当前用户的角色过滤视图?

时间:2013-12-30 13:26:00

标签: drupal-7 drupal-views roles

使用Drupal7,Views3和Node Reference模块,我使用视图填充自定义内容类型的节点引用字段。 (因此它是“参考”显示类型的视图。)

我想过滤此视图以仅显示(并允许用户选择):

  1. 发布的内容(确定)
  2. 某种类型的内容(OK)
  3. 仅当前用户创建的节点(确定)
  4. 如果当前用户是管理员或其他角色,则绕过先前的过滤器(3)并显示所有节点(但仍然尊重过滤器1和2)(确定)
  5. 过滤器1和2始终是强制性的;那么过滤器3或4也必须是强制性的。我知道我可以将过滤器重新排列到过滤器组中以使其工作。问题是我找不到构建过滤器4的方法。

    对于过滤器3,我必须引入“内容:作者”类型的关系,这会产生很多新的过滤器,包括我用于过滤器3的“用户:当前”(节点作者==当前)用户)。

    对于过滤器4,我需要根据当前用户不是作者)的角色进行过滤,我找不到如何做到这一点。

    在过滤器列表中有一个新的“用户:角色”过滤器可用,但它只引用“内容:作者”关系,因此它只检查节点作者的角色。那不是我需要的。

    我猜我必须添加一个新关系来引入当前用户数据(类似“User:current”),然后对该数据进行过滤,但我无法在Add Relationship屏幕中找到它。 / p>

    知道怎么做吗? 提前谢谢。

    更新
    注意:在编辑节点引用字段时(在我的自定义内容类型中),我看到有一个“views arguments”字段允许将参数传递给视图。目前尚不清楚该字段是否接受令牌,但如果是这样,也许我可以使用该字段将当前用户ID传递给View。但后来我不知道如何在视图中使用它......

2 个答案:

答案 0 :(得分:1)

在发布same question on drupal.stackexchange之后,我在一个视图(上下文过滤器)中使用了一些PHP代码建议了一个解决方案。这是我发现的最佳解决方案,所以除非有人能提出更好的解决方案,否则我会坚持使用这个解决方案。

以下是解决方案: https://drupal.stackexchange.com/questions/38205/alter-field-settings-using-hook/38922#38922

以下是它的要点:

在视图中,在Author: Uid上添加上下文过滤器,并使用以下设置:

当过滤器价值不可用时

  • 提供默认值
  • 类型:PHP代码

使用以下代码:

global $user;

if (in_array('administrator', $user->roles))
{return -1;}
else
{return $user->uid;}

当提供过滤器价值或提供默认值时

  • 指定验证标准
  • 验证者:PHP代码

使用以下代码:

if ($argument == -1) 
{return FALSE;}
else
{return TRUE;}
  • 过滤器值未验证时要采取的操作:显示指定字段的所有结果(这将使管理员可以访问所有结果)

就是这样!

注意:

与我的初始设置相比,不再需要关系(内容:作者);也不是“作者”过滤器(无论如何都由关系引入)。

对于Drupal 6,第一个PHP代码段中的条件应该是if (in_array('super user', array_values($user->roles)))

您也可以通过编辑上述条件来允许其他角色。例如:

if (
    in_array('administrator', $user->roles) || 
    in_array('editor', $user->roles)
)

答案 1 :(得分:0)

添加作者关系后,应该有新的过滤条件User: Roles

在您的观看过滤条件中,您需要 OR 组合 2个过滤器组;第一组包含过滤器1,2和3.另一组应包含过滤器1,2和4。