Drupal Views 将作者姓名的过滤器显示为下拉列表

Posted

技术标签:

【中文标题】Drupal Views 将作者姓名的过滤器显示为下拉列表【英文标题】:Drupal Views exposed filter of Author name as a drop down 【发布时间】:2010-10-07 12:42:42 【问题描述】:

这是Drupal Views exposed filter of Author name 的后续问题。以下问题已得到解答并且有效。我可以按用户名过滤视图。输入的用户名是通过在一个框中输入的,然后该框会自动完成。而不是这样做,我希望用户列表作为下拉列表。我只需要选择一个用户。你知道这是否可能吗?

【问题讨论】:

【参考方案1】:

您需要一个自定义模块。

我是这样为 Drupal 7 做的:创建一个模块,比如说,views_more_filters,所以你有一个像这样的views_more_filters.info 文件:

name = Views More Filters
description = Additional filters for Views.
core = 7.x

files[] = views_more_filters_handler_filter_author_select.inc
files[] = views_more_filters.views.inc

(文件views_more_filters_handler_filter_author_select.inc 将包含我们的过滤器处理程序)。

一个基本的views_more_filters.module 文件:

<?php
/**
 * Implements of hook_views_api().
 */
function views_more_filters_views_api() 
  return array('api' => 3);

然后在views_more_filters.views.inc中定义你的过滤器:

<?php
/**
 * Implements of hook_views_data().
 */
function views_more_filters_views_data() 
  return array(
    'node' => array(
      'author_select' => array(
        'group' => t('Content'),
        'title' => t('Author UID (select list)'),
        'help' => t('Filter by author, choosing from dropdown list.'),
        'filter' => array('handler' => 'views_more_filters_handler_filter_author_select'),
        'real field' => 'uid',
      )
    )
  );

请注意,我们将 author_select 设置为过滤器的机器名称、定义的过滤器处理程序 ('handler' =&gt; 'views_more_filters_handler_filter_author_select') 和我们将作为过滤依据的字段 ('real field' =&gt; 'uid')。

现在我们需要实现我们的过滤器处理程序。由于我们的过滤器功能与默认的views_handler_filter_in_operator 一样,我们只需在views_more_filters_handler_filter_author_select.inc 文件中扩展其类:

<?php
/**
 * My custom filter handler
 */
class views_more_filters_handler_filter_author_select extends views_handler_filter_in_operator 

  /**
   * Override parent get_value_options() function.
   *
   * @return
   *   Return the stored values in $this->value_options if someone expects it.
   */
  function get_value_options() 
    $users_list = entity_load('user');

    foreach ($users_list as $user) 
      $users[$user->uid] = $user->name;
    

    // We don't need Guest user here, so remove it.
    unset($users[0]);

    // Sort by username.
    natsort($users);

    $this->value_options = $users;

    return $users;
  

我们在这里不需要做太多事情:只需使用我们的用户列表填充选项数组,其余的由父类处理。

欲了解更多信息,请参阅:

Views API Where can I learn about how to create a custom exposed filter for Views 3 and D7? Drupal 答案 Demystifying Views API - A developer's guide to integrating with Views Sophisticated Views filters, part2 - writing custom filter handler (in Russian, link to Google translator) Tutorial: Creating Custom Filters in Views

【讨论】:

这是我为这个问题找到的第一个解决方案,它干净且有意义。 :) 很好的解决方案,不过这里只有一个问题。这是否应该将所有用户过滤器(包括现有的过滤器)更改为下拉列表? 很好的答案。最好使用 hook_views_data_alter ,因为您正在修改现有数组。 如果有人想为当前用户设置默认选择,只需在 return $users; 之前添加几行即可:global $user; if (array_key_exists($user-&gt;uid, $users)) $this-&gt;value = $user-&gt;uid; 【参考方案2】:

是的,这是可能的。做到这一点并不是特别困难......但它有点乏味。你需要创建两个视图

    第一个视图是系统上的用户列表(Users 类型的视图)。此用户列表显示为下拉列表而不是列表(使用跳转菜单视图样式)。单击此下拉列表中的任何用户将调用第二个视图,其中所选用户的 uid(用户 ID)作为 URL 中的参数。此视图是一个块。 第二个视图是一个简单的节点列表。它是特定 URL 的页面视图。它需要 1 个参数,即用户的 uid(用户 ID)。

详细步骤

    下载 Ctools 模块 http://drupal.org/project/ctools 启用混沌工具模块。这 模块提供了一个视图样式插件 称为“跳转菜单” 创建一个Users 类型的新视图,而不是你通常使用的Node 创造。在字段中添加User: NameUser: uid。为了 User: uid 的设置,确保 你点击Rewrite the output of the field。重写后的输出 该字段应该是 my_node_list/[uid]。确保你 选中 exclude from display 复选框。 在视图中Style 的设置中,选择Jump Menu 样式。单击样式的设置。确保 Path 下拉列表已选择 User: uid 向视图添加块显示。将块命名为User Drop Down 保存视图 将块 User Drop Down 添加到您主题中的任何区域,例如内容顶部(通常是最好的)或左侧边栏。通过设置块可见性设置,确保块仅在 URL my_node_list/*my_node_list 可见 现在创建另一个Node 类型的视图。添加参数字段User: uid。添加您感兴趣的字段,例如Node: titleUser: Name 等 添加页面显示。让页面位于 url my_node_list 保存视图。在http://yoursitename/my_node_list 使用系统上的用户列表测试下拉列表

【讨论】:

@Linda:答案对你有帮助吗? 我认为这与 OP 问题无关。跳转菜单与视图过滤器不同。第一个跳转到一个页面,第二个过滤结果。 @swan - 你说得对,Ctools Jump 菜单与过滤器不同,但因为没有开箱即用的方法来执行下拉视图过滤器用户名,这是一个聪明的解决方法。【参考方案3】:

http://drupal.org/project/better_exposed_filters 检查这个

【讨论】:

我认为这不会提供包含所有用户列表的下拉列表。所以我认为这不会有用。【参考方案4】:

我认为您只需要选择“Taxonomy:term The taxonomy term ID”而不是“name”。

【讨论】:

Taxonomy 与 User 不同 - 因此过滤器无法解决这个问题。不过,这对于分类过滤器来说是一个很好的答案!【参考方案5】:

在这里找到了一个简单的解决方案。 http://bryanbraun.com/2013/08/06/drupal-tutorials-exposed-filters-with-views

【讨论】:

以上是关于Drupal Views 将作者姓名的过滤器显示为下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7 将过滤器价格范围显示为复选框

(Drupal 6 Views)如何制作一个显示特定节点列表的视图(按节点ID)?

如何在没有面板的Views Drupal 7中将组ID作为上下文

Drupal 6 Views - 获取和设置记住的过滤器值

Drupal Views2 暴露形式

Drupal 6 & Views 2 - DISTINCT 字段