Drupal Views exposed filter of Author name as a drop down

Linda picture Linda · Oct 7, 2010 · Viewed 17.5k times · Source

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?

Answer

Shevchuk picture Shevchuk · May 13, 2013

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: