Apache Solr: Conditionally Display Facet Blocks

In my last post, I showed a method for conditionally displaying facet blocks with Search Lucene, depending on the type of query being performed.  This can also be adapted to work for Apache Solr, albeit with a different mechanism. The easiest way to do this with Apache Solr is to use the Context module to control which facet blocks are displayed, along with when and where they are displayed.  In this example, I set up a context based on path, where that path was search/apachesolr/*.  I then added all of my Apache Solr facet blocks in the context. With the context configured, I now have the ability to alter that context on the fly, based on whatever conditions I choose. 

<?php 

/**
 * Implementation of hook_context_active_contexts_alter().
 *
 * <a href="http://twitter.com/param">@param</a> mixed $contexts
 *   Associative array of context objects
 */
function MYMODULE_context_active_contexts_alter(&$contexts) {
  
// If one of the active contexts is the apachesolr_search context, remove 
  // some unneccessary blocks
  
if(in_array('search-apachesolr-search'array_keys($contexts))) {
    
/**
     * Look at the type of query that has been performed, and set a flag regarding whether or 
     * not to show the biblio facets if the type:biblio filter is in effect
     */
    
$show_biblio_facets false;
    
$query apachesolr_current_query();
    if(
$query) {
      if(
$query->has_filter('type''biblio')) {
        
$show_biblio_facets true;
      }
    }
    
// Loop through the apachesolr-search blocks and remove the Biblio facet blocks if needed
    
foreach($contexts['search-apachesolr-search']->block as $bid => $block) {
      if(
preg_match('/^apachesolr_biblio_/'$bid)) {
        if(!
$show_biblio_facets) {
          unset(
$contexts['search-apachesolr-search']->block[$bid]);
        }
      }
    }
  }
}

?>
 In this example, I get all of the active contexts, and if my apachesolr-search context is in effect, I look at the current Apache  Solr query to see what filters have been applied.  In the example, a flag is set to show the biblio facets if the current search is filtering by the biblio content type. There may be other methods for displaying facets conditionally in Apache Solr; however, I find this method to be fairly straightforward, and if you're not currently using Context for controlling block placement in Drupal, you should definitely reconsider that decision.

Trackback URL for this post:

http://beyrent.net/trackback/243

Comments

Post new comment

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

About Erich

Erich is a web developer and a native New Englander who is passionate about life, the universe, and everything.

He is currently a senior Drupal developer at Harvard University, working on the IQSS OpenScholar project.  Prior to joining the team at Harvard, he was the engineering manager at CommonPlaces e-Solutions, in Hampstead, NH, contributing as the lead engineer on the Greenopolis.com and Twolia.com.

Erich is active in the Drupal community, having contributed modules and patches to the community. He presented at DrupalCon in Szeged Hungary, and co-presented at DrupalCon 2009 in Washington, DC.

Erich lives in New Hampshire with his wife, two sons, and two weimaraners.  When not writing code, Erich enjoys landscaping and woodworking.

Faceted search

Categories

Content type

Project types

Artwork Type

Artwork Tags

Recent comments

ebeyrent's tweets

Activity Stream

September 2, 2010

September 1, 2010

  • Twitter ebeyrent tweeted "@cpliakas LOL @webkenny as @acquia product" 11:23am #

August 31, 2010

  • Twitter ebeyrent tweeted "Dear @msnbc, I want to see the hurricane report, not a goddamn advertisement!! #thisisseriousshit" 12:08pm #
  • Twitter ebeyrent tweeted "Need a good D6 starter theme, looking at Blueprint, Fusion, and Omega. Any other recommendations? Preferences? #drupal" 11:35am #

August 30, 2010

  • Twitter ebeyrent tweeted "Having fun upgrading a D5 site to D6. #drupal" 3:05pm #
  • Twitter ebeyrent tweeted "@DrupalSnark Believe it or not, this was actually from a DrupalCamp presentation at Yale this weekend..." 11:38am #
  • Twitter ebeyrent tweeted "Today is an exciting and bittersweet milestone. My oldest son enters first grade..." 6:31am #

August 28, 2010

  • Twitter ebeyrent tweeted "Following @jjeff's presentation was like walking into the opera wearing my clown shoes. #drupalcampct" 4:38pm #
  • Twitter ebeyrent tweeted "Overlay module in #drupal 7 is awful. Don't use it. #drupalwtf" 4:31pm #
  • Twitter ebeyrent tweeted "Profile module in #drupal 7 doesn't use fields. Still. Don't use it. #drupalwtf" 4:29pm #
  • Twitter ebeyrent tweeted "Slides from the "Hack-proof Your Drupal App" presentation at #drupalcampct are online: http://bit.ly/9q9yRK" 4:19pm #
  • Twitter ebeyrent tweeted "@jjeff consults the orb at #drupalcampct" 2:42pm #
  • Twitter ebeyrent tweeted "Listening to @jjeff's presentation at #drupalcampct" 2:21pm #