This is a follow up question to Drupal Views exposed filter of Author name. The following question was answered and works. I can filter a view by user name. The user name is entered is entered by typing in a box and the box then auto completes. Rather then doing this I would like the list of users as a drop down. I only need one user to be selected. Do you know if this is possible?
You'll need a custom module for that.
I've done this for Drupal 7 this way: create a module, say, views_more_filters
, so you have a views_more_filters.info
file like this:
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
(file views_more_filters_handler_filter_author_select.inc
will contain our filter handler).
A basic views_more_filters.module
file:
<?php
/**
* Implements of hook_views_api().
*/
function views_more_filters_views_api() {
return array('api' => 3);
}
Then define your filter in 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',
)
)
);
}
Note that we set author_select
as a machine name of the filter, defined filter handler ('handler' => 'views_more_filters_handler_filter_author_select'
) and a field we will filter by ('real field' => 'uid'
).
Now we need to implement our filter handler. As our filter functions just like default views_handler_filter_in_operator
, we simply extend its class in views_more_filters_handler_filter_author_select.inc
file:
<?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;
}
}
We haven't had to do much here: just populate options array with a list of our users, the rest is handled by parent class.
For further info see:
Yes, this is possible. Its not particularly tough to do this... but its slightly tedious. You need to create two views
Users
). This user list is displayed as a dropdown instead of a list (using jump menu view style). Clicking on any user within this dropdown will call the second view with the uid (user id) of the selected user as the argument in the URL. This view is a block.Detailed Steps
Users
and NOT type Node
which you usually
create. In the fields add User:
Name
and User: uid
. For the
settings of User: uid
, make sure
you click on Rewrite the output of
the field
. The rewritten output of
the field should be
my_node_list/[uid]
. Make sure you
select the exclude from display
checkbox.Style
in the view, select the Jump Menu
style. Click on the settings for the style. Make sure the Path
dropdown has User: uid
choosenUser Drop Down
User Drop Down
to any region in your theme e.g. Content Top (usually the best) or left sidebar. Make sure the block is only visible at the urls my_node_list/*
and my_node_list
by setting the block visibility settingsNode
. Add an argument field User: uid
. Add the fields you are interested in e.g. Node: title
, User: Name
etc.my_node_list
http://yoursitename/my_node_list
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With