victorpavlov
9/30/2016 - 1:00 PM

Adding icons to menu links in Drupal

Adding icons to menu links in Drupal

<?php
/**
 * Custom implementation of theme_menu_link() for including icons.
 */

function cic_menu_link__icon(array $variables) {
  $element = $variables['element'];
  $sub_menu = '';

  /* Prevent the <span> tag from being escaped */
  $element['#localized_options']['html'] = TRUE;

  if ($element['#below']) {
    $sub_menu = drupal_render($element['#below']);
  }
  $icon = '<span' . drupal_attributes($element['#icon_attributes']) . '></span>';
  $output = l($icon . $element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

/**
 * Implements hook_preprocess_menu_link()
 */

function cic_preprocess_menu_link(&$vars) {
  /* Set shortcut variables. Hooray for less typing! */
  $menu = $vars['element']['#original_link']['menu_name'];
  $mlid = $vars['element']['#original_link']['mlid'];
  $item_classes = &$vars['element']['#attributes']['class'];
  $link_classes = &$vars['element']['#localized_options']['attributes']['class'];

  /* Set icon attributes */
  $vars['element']['#icon_attributes'] = array(
    'aria-hidden' => array('true'),
    'class' => array()
  );
  $icon_attributes = &$vars['element']['#icon_attributes'];

  /* Add global classes to all menu links */
  $item_classes[] = 'nav-item';
  $link_classes[] = 'nav-link';

  switch ($menu) {
    case 'menu-utility':
      /* Add icons to all links in the utility menu. */
      $vars['theme_hook_suggestions'][] = 'menu_link__icon';

      /* Designate which icons to use for each menu link */
      switch ($mlid) {
        /* RSS link */
        case '535':
          $icon_attributes['class'][] = 'icon icon-rss';
          break;

        /* Email Updates link */
        case '536':
          $icon_attributes['class'][] = 'icon icon-email';
          break;
        }
      break;
  }
}