Display Views result only when exposed filters are set

Appnovation put a small Views tutorial online today, which hides the results of a View with exposed filters on initial display, when no filter value is set. However, the shown approach has a small performance backdraw: it hooks into the view to discard the result after querying the database. A code snippet on drupal.org avoids this by adding an impossible condition to the query, however it requires the use of a dummy argument and – worse – PHP to be executed in Views' argument handler.

Here's how to do it avoiding above pitfalls (put in custom.module):
/**
 * Implementation of hook_views_query_alter().
 */
function custom_views_query_alter(&$view, &$query) {
  if ($view->name == 'My_View' && $view->current_display == 'page') {
    // Don't display results until at least one exposed filter has a value set.
    $filter_set = FALSE;
    foreach ($view->filter as $filter) {
      // Check if we've found a filter identifier that is set.
      if ($filter->options['exposed'] && array_key_exists($filter->options['expose']['identifier'], $_GET)) {
        $filter_set = TRUE;
        break;
      }
    }
  
    // If the filter isn't set, add a WHERE clause to the query that
    // cannot be TRUE. This ensures the view returns no results.
    if (!$filter_set) {
      $query->add_where(0, 'FALSE');
      // To display a different message (or no message at all) you
      // also might want to adjust the Views' empty text. 
      //$view->display_handler->options['empty'] = '';
    }
  }
}

2 comments:

Mark Tawin said...

Hi Stefan
I'm writing to you because I casually found your post;you seem very knowledgeable on exposed filter and I can not find anything on this topic.
Simply: do you think it could be possible to create a hack to put a WHERE condition in the first exposed filter? I'll explain better. With my first exposed filter I choose a gallery from which i will see the content (images nid dependant)to edit.Galleries has a flag open/close with whom I would like to select those that are still to be edited, otherwise, in the long time i will have too long galleries name.
I can not put cascade AND condition in the view because view is set to Node-Type Images. I should then be able to select the still "open". Do you think may be possible to hack this process ?
Thanks a lot and sorry if i disturbed.

Anil Gupta said...

Thanks for the information. Helped us to convince most on how this process works and what they could achieve by following these guidelines.
Bangalore Web Designing Company, UI Designing Company Bangalore