background image
HomeRecent PostsDrupalSearchTagsRSSContactAboutAccount

Grouping search results by node type in collapsible fieldsets

Eric.London's picture

This code snippet will group your search results in collapsible fieldsets by node type.

<?php
function MYTHEME_search_page($results, $type) {
 
$html = '<dl class="search-results">';

 
// get a list of node types
 
$nodeTypes = node_get_types();
   
 
// loop through results, group by type
 
$resultTypes = array();
  foreach (
$results as $result) {
   
$resultTypes[$result['node']->type][] = $result;   
  }
   
 
// create fieldsets for each type
 
foreach ($resultTypes as $resultType => $resultTypeResults) {
   
$value = "";
   
// loop through entries
   
foreach ($resultTypeResults as $entry) {
     
$value .= theme('search_item', $entry, $type);
    }
       
   
// add fieldset
   
$html .= theme('fieldset',
      array(
       
'#title' => $nodeTypes[$resultType]->name,
       
'#collapsible' => TRUE,
       
'#collapsed' => FALSE,
       
'#value' => $value,
      )
    );
       
  }
   
 
$html .= '</dl>';
 
$html .= theme('pager', NULL, 10, 0);
   
  return
$html;
}
?>

you would think that this would be a common thing!

thank you SO much for this. it's beautiful to find a drupal trick that works so easily and simply.

drupal 6 version

Based on the above, I just coded up a drupal 6 version:

<?php
function TEMPLATENAME_preprocess_search_results(&$variables) {
   
   
$variables['search_results'] = '';
 
   
// get a list of node types
   
$nodeTypes = node_get_types();

   
// loop through results, group by type
   
$resultTypes = array();
    foreach (
$variables['results'] as $result)
    {
       
$resultTypes[$result['node']->type][] = $result;  
    }
   

   
// create fieldsets for each type
   
foreach ($resultTypes as $resultType => $resultTypeResults)
    {
       
$value = "";
       
// loop through entries
       
foreach ($resultTypeResults as $result)
        {
           
$value .= theme('search_result', $result, $variables['type']);
        }
      
       
// add fieldset
       
$variables['search_results'] .= theme('fieldset',
            array(
               
'#title' => $nodeTypes[$resultType]->name,
               
'#collapsible' => TRUE,
               
'#collapsed' => FALSE,
               
'#value' => $value,
            )
        );
      
    }
 
   
$variables['pager'] = theme('pager', NULL, 10, 0);
   
// Provide alternate search results template.
   
$variables['template_files'][] = 'search-results-'. $variables['type'];
}
?>

I've managed to get this to

I've managed to get this to work in Drupal 7

<?php
function TEMPLATENAME_preprocess_search_results(&$variables) {
   
$variables['search_results'] = '';
   
// get a list of node types
   
$nodeTypes = node_type_get_types();
   
// loop through results, group by type
   
$resultTypes = array();
    foreach (
$variables['results'] as $result) {
       
$resultTypes[$result['node']->type][] = $result;  
    }
   
   
// create fieldsets for each type
   
foreach ($resultTypes as $resultType => $resultTypeResults) {
       
$value = "";
       
// loop through entries
       
foreach ($resultTypeResults as $result) {
           
$value .= theme('search_result', array('result' => $result, 'module' => $variables['module']));
        }
       
//$variables['search_results'] .= $value;
        // add fieldset
       
       
$variables['search_results'] .= theme('fieldset',
            array(
               
'element' => array(
                   
'#title' => $nodeTypes[$resultType]->name,
                   
'#collapsible' => TRUE,
                   
'#collapsed' => FALSE,
                   
'#value' => $value
               
)
            )
        );
    }
?>

Any help on making this work

Any help on making this work for Druapl 7?