Drupal:在Views中使用查询字符串数据

时间:2011-08-02 09:57:56

标签: drupal-6 views

我在drupal网站上有几个版主角色。具有此角色的用户可以创建名为“新闻”的特定内容类型的内容。让我们调用以下角色:role_a,role_b,role_c,...

现在我有一个显示最后5个新闻元素的视图。

我的问题是如何根据查询字符串对View中的News元素进行粒化? 我的意思是在页面http://mysite.com/a我想只看到用户添加“a”角色的新闻。 http://mysite.com/b用于“b”级用户。等

如何在Views过滤器中使用查询字符串参数?

2 个答案:

答案 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;
      }
    }
  }
}