我在drupal网站上有几个版主角色。具有此角色的用户可以创建名为“新闻”的特定内容类型的内容。让我们调用以下角色:role_a,role_b,role_c,...
现在我有一个显示最后5个新闻元素的视图。
我的问题是如何根据查询字符串对View中的News元素进行粒化? 我的意思是在页面http://mysite.com/a我想只看到用户添加“a”角色的新闻。 http://mysite.com/b用于“b”级用户。等
如何在Views过滤器中使用查询字符串参数?
答案 0 :(得分:1)
我认为你的意思是你想要使用Argument而不是查询字符串。在任何情况下,我都认为View默认情况下不会处理角色名(它可以很好地处理角色ID),所以你必须修改你的视图查询才能达到你想要的效果。
首先,在视图中添加User:Roles作为参数。然后,在自定义模块中,实现hook_views_query_alter()并通过将rolename替换为其角色ID来修改查询。
function MYMODULE_views_query_alter(&$view, &$query) {
if ($view->name == 'my_view') {
$rolename = '';
foreach ($query->where as $where_index => $where) {
// find the role ID clause
$clause_index = array_search('users_roles.rid = %d', $where['clauses']);
if ($clause_index !== FALSE) {
// found it, so get the rolename
$rolename = $where['args'][$clause_index];
break;
}
}
// if the rolename argument was found
if (!empty($rolename)) {
// get the role ID
$user_roles = user_roles();
$rid = array_search($rolename, $user_roles);
// if the role exists, then replace the argument
if ($rid !== FALSE) {
$query->where[$where_index]['args'][$clause_index] = $rid;
}
}
}
}
因此,例如,如果您的网址为http://mysite.com/a,则会查找角色“a”的ID,然后由具有该角色的作者查找所有节点。它还将采用实际角色ID - 例如,如果角色“a”的ID为10,则http://mysite.com/10也将返回相同的结果。
如果你只想查找角色名,你可以在没有找到角色时修改钩子失败(只需make $ rid = 0,你就不应该得到任何结果)。
答案 1 :(得分:0)
function MYMODULE_views_query_alter(&$view, &$query) {
if ($view->name == 'my_view') {
$rolename = '';
foreach ($query->where as $where_index => $where) {
// find the role ID clause
$clause_index = array_search('users_roles.rid = %d', $where['clauses']);
if ($clause_index !== FALSE) {
// found it, so get the rolename
$rolename = $where['args'][$clause_index];
break;
}
}
// if the rolename argument was found
if (!empty($rolename)) {`enter code here`
// get the role ID
$user_roles = user_roles();
$rid = array_search($rolename, $user_roles);
// if the role exists, then replace the argument
if ($rid !== FALSE) {
$query->where[$where_index]['args'][$clause_index] = $rid;
}
}
}
}