【发布时间】:2010-10-07 12:42:42
【问题描述】:
这是Drupal Views exposed filter of Author name 的后续问题。以下问题已得到解答并且有效。我可以按用户名过滤视图。输入的用户名是通过在一个框中输入的,然后该框会自动完成。而不是这样做,我希望用户列表作为下拉列表。我只需要选择一个用户。你知道这是否可能吗?
【问题讨论】:
标签: drupal drupal-6 drupal-views
这是Drupal Views exposed filter of Author name 的后续问题。以下问题已得到解答并且有效。我可以按用户名过滤视图。输入的用户名是通过在一个框中输入的,然后该框会自动完成。而不是这样做,我希望用户列表作为下拉列表。我只需要选择一个用户。你知道这是否可能吗?
【问题讨论】:
标签: drupal drupal-6 drupal-views
您需要一个自定义模块。
我是这样为 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' => 'views_more_filters_handler_filter_author_select') 和我们将作为过滤依据的字段 ('real field' => '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;
}
}
我们在这里不需要做太多事情:只需使用我们的用户列表填充选项数组,其余的由父类处理。
欲了解更多信息,请参阅:
【讨论】:
hook_views_data_alter ,因为您正在修改现有数组。
return $users; 之前添加几行即可:global $user; if (array_key_exists($user->uid, $users)) { $this->value = $user->uid; }
是的,这是可能的。做到这一点并不是特别困难......但它有点乏味。你需要创建两个视图
Users 类型的视图)。此用户列表显示为下拉列表而不是列表(使用跳转菜单视图样式)。单击此下拉列表中的任何用户将调用第二个视图,其中所选用户的 uid(用户 ID)作为 URL 中的参数。此视图是一个块。详细步骤
Users 类型的新视图,而不是你通常使用的Node
创造。在字段中添加User:
Name 和User: 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: title、User: Name 等my_node_list
http://yoursitename/my_node_list 使用系统上的用户列表测试下拉列表
【讨论】:
【讨论】:
我认为您只需要选择“Taxonomy:term The taxonomy term ID”而不是“name”。
【讨论】:
【讨论】: