Adding Bootstrap Badges to Drupal Views Lists

views list with counts badges top2

Adding Bootstrap Badges to Drupal Views Lists

There is a neat little trick in Views to create lists with counts. For example, if I created a list of categories for blog posts, I can have Views add the number of posts in each category with a little extra configuration.

 

The trick for adding the counts is in the views display configuration to setup a contextual filter with the option Display a summary. This option provides the additional setting, Display record count with link, that turns on the counts.

Configuration for views counts

 

The challenge is I want to output the counts as Bootstrap badges in an HTML list to take full advantage of Bootstrap's standard components. So I need to wrap the count markup in with

<span class="badge">12</span>

 

At first glance the answer would seem to be to override views-view-list.tpl.php in your theme. That doesn't work. When you select the Display a summary setting in views, it redirects the theming to a different template, views-view-summary.tpl.php. (This one stumped me for a while, so I hope this saves you the time I spent figuring out why my views-view-list.tpl.php wasn't firing.)

To override the list view, you need to create a hook-views-view-summary.tpl.php template using the code:

 

If you are doing the override in your theme, name the template file, mytheme-views-view-summary.tpl.php. If in a module, mymodule-views-view-summary.tpl.phpviews-view-summary.tpl.php.

This template will work using Views' built preprocessing function, template_preprocess_views_view_summary. However, you will likely want to implement your own preprocessing function. Notice that in addition to the <span class="badge"> the above template allows for additional classes. You might want to add a pull-right for example to take advantage of Bootstrap's built in float classes.

An example custom preprocess function would look like this: (replace "hook" with your theme or module name)

function hook_preprocess_views_view_summary(&$vars) {
  // leverage views built in logic for vars preprocessing
  template_preprocess_views_view_summary($vars);

  // add support for badge classes
  $vars['row_badge_classes'] = array();
  
  // set default badge classes
  $row_classes_default = 'pull-right';

  foreach ($vars['rows'] as $id => $row) {
    $vars['row_badge_classes'][$id] = $row_badge_classes_default;
  }
}

 

If you are implementing your override in a theme, your done. If in a module, you need one extra piece. You need to add your override to the theme registry. Normally I would do this using hook_theme:

function mymodule_theme() {
  $themes = array();

  $themes['views_view_summary'] = array(
    'arguments' => array(
      'view' => NULL,
      'options' => NULL,
      'rows' => NULL,
      'title' => NULL,
      'context' => NULL,
    ),
    'template' => 'mymodule-views-view-summary',
    'original hook' => 'views_view_summary',
    'path' => drupal_get_path('module', 'mymodule') . '/theme/list',
    'preprocess functions' => array(
      'template_preprocess',
      'template_preprocess_views_view_summary',
      'mymodule_preprocess_views_view_summary',
    ),
  );
  return $themes;
}

 

I actually could not get this to work. It would call my preprocess function, but not override the template with my template. So I took an alternative approach of using hook_theme_registry_alter:

function mymodule_theme_registry_alter(&$theme_registry) {
  $theme = &$theme_registry['views_view_summary'];
  $theme['path'] = drupal_get_path('module', 'mymodule') . '/theme/list';
  $theme['template'] = 'mymodule-views-view-summary';
}

 

That worked and it is less code. Now all the list views should be outputting badgeified lists.

views lists with badges

 

Related Posts

Using Views Responsive Grid in Drupal 7

Ian Whitcomb
Read more

Adding fields in Drupal 7

Tom McCracken
Read more

Video: Better Content Formatting Using CK Editor, Bootstrap & Drupal

Brent Bice
Read more

How to use Drupal Bootstrap with Webforms

Kristin Brinner
Read more

CSS Frameworks: Bootstrap 3 vs Foundation 5

Felipa Villegas
Read more

Bootstrap 4: An Overview

Kendall Westbrook
Read more