Limiting select options for exposed filter

Limiting select options for exposed filter

FFW Marketing
Thought byFFW Marketing
Website Administrator
May 17, 2013

While I was working on a project here at FFW, I had a requirement to limit the options for an exposed filter in order to get only options that will give some results. Unfortunately Views don’t provide this kind of functionality.

Let's start with an example. I have a Content Type called "People" which has a Term Reference select list. Generally speaking we have to alter the “views_exposed_form”.

Follow the next 3 steps:

1. Create a custom module and implement hook_form_alter(). I strongly recommend not to use a form-specific alteration like hook_form_FORM_ID_alter() instead of global hook_form_alter()because it is difficult to control and manage your code.

function [my-module-name]_form_alter) { dsm($form); //be sure to enable devel module. }

2. Now you should get the content from the $form variable

3. Next, we have to select all the matching results based on our conditions in order to edit the options from $form['term']['#options']. Personally, I prefer to query directly with db_select, but feel free to use EntityFieldQuery if you prefer.

function [my-module-name]_form_alter(&$form, &$form_state, $form_id) { if ($form['#id'] == 'views-exposed-form-people-list-page') { $available_terms = _get_available_terms(); if (isset($available_terms)) { // Unset the existing list and add new one with available terms. unset($form['term']['#options']); $form['term']['#options']['All'] = '- Any Term -'; foreach ($available_terms as $available_term) { $form['term']['#options'][$available_term->tid] = $available_term->name; } } else { // Unset all options except '- Any -' unset($form['term']['#options']); $form['term']['#options']['All'] = '- Any Term -'; } } }

function _get_available_terms() { $query = db_select('taxonomy_term_data', 'terms'); $query->join('field_data_field_reference', 'term_ref', 'term_ref.field_reference_tid = terms.tid'); $term_result = $query ->fields('terms', array('tid', 'name')) ->execute() ->fetchAll(); return $term_result; }

That's it.

Topics:
drupal

Fill out the form to learn how FFW can support your needs.

Read next:

Blog
Image of plane flying above cloud with pink sky

Open source software can provide many benefits to Chief Information Officers or other technical roles. Here's why.

Blog
Man standing on edge of cliff with clouds

Usher customers through the sales funnel with messages that are consistent, tailored, and effective.

Blog
Image of sailboat with land behind it and cloudy sky

Acquia Drupal Cloud is a content platform built to help users rapidly create content at scale.

Blog
Image of Drupal 8 icon with arrow to Drupal 9 icon on blue background

Test your Drupal 9 upgrade now