Community Documentation

theme_links

5 theme.inc theme_links($links, $attributes = array('class' => 'links'))
6 theme.inc theme_links($links, $attributes = array('class' => 'links'))
7 theme.inc theme_links($variables)
8 theme.inc theme_links($variables)

Return a themed set of links.

Parameters

$links: A keyed array of links to be themed.

$attributes: A keyed array of attributes

Return value

A string containing an unordered list of links.

Related topics

File

includes/theme.inc, line 1203
The theme system, which controls the output of Drupal.

Code

<?php
function theme_links($links, $attributes = array('class' => 'links')) {
  global $language;
  $output = '';

  if (count($links) > 0) {
    $output = '<ul' . drupal_attributes($attributes) . '>';

    $num_links = count($links);
    $i = 1;

    foreach ($links as $key => $link) {
      $class = $key;

      // Add first, last and active classes to the list of links to help out themers.
      if ($i == 1) {
        $class .= ' first';
      }
      if ($i == $num_links) {
        $class .= ' last';
      }
      if (isset($link['href']) && ($link['href'] == $_GET['q'] || ($link['href'] == '<front>' && drupal_is_front_page()))
           && (empty($link['language']) || $link['language']->language == $language->language)) {
        $class .= ' active';
      }
      $output .= '<li' . drupal_attributes(array('class' => $class)) . '>';

      if (isset($link['href'])) {
        // Pass in $link as $options, they share the same keys.
        $output .= l($link['title'], $link['href'], $link);
      }
      else if (!empty($link['title'])) {
        // Some links are actually not links, but we wrap these in <span> for adding title and class attributes
        if (empty($link['html'])) {
          $link['title'] = check_plain($link['title']);
        }
        $span_attributes = '';
        if (isset($link['attributes'])) {
          $span_attributes = drupal_attributes($link['attributes']);
        }
        $output .= '<span' . $span_attributes . '>' . $link['title'] . '</span>';
      }

      $i++;
      $output .= "</li>\n";
    }

    $output .= '</ul>';
  }

  return $output;
}
?>

Comments

Use theme_links to theme primary links

Note, this theme function is the one to override for theming primary links.

Your statement is not entirely true

You use this function to override the the output of anywhere the theme_links function is being used. So not just primary links, could also be secondary links as well. Lullabot has a good video on this http://www.lullabot.com/videos/using-secondary-menus.

Allow HTML in Link Title

In case you need to allow HTML in link titles, simply change this

if (isset($link['href'])) {
        // Pass in $link as $options, they share the same keys.
        $output .= l($link['title'], $link['href'], $link);
}

with this:

if (isset($link['href'])) {
$link['html'] = true;
        // Pass in $link as $options, they share the same keys.
        $output .= l($link['title'], $link['href'], $link);
}

dont hack the core...

please dont suggest other users to hack the core... core hacking will be prevent you from updates. You can create a theme override in your template.php and modify the code at this point.

best regards
Dennis

The right way: allow HTML in Link Title

You don't never need to break the core. Use the option 'html' => TRUE.

<?php
$links
= array();
$links[my_link] = array(
     
'title' => '<h2>un BIG title<br /> with html</h2>'
      'href'
=> 'page/path',
     
'html' => TRUE,
  );
$links[my_link_separator] = array(
     
'title' => '<hr />'
      'html'
=> TRUE,
  );
$output = theme_links($links,array('id' => 'my_links'));
?>

If you want pass more specific html use theme_item_list

Error

While PHP may let you get away with, this, you are still producing error messages. $links[my_link] needs apostrophes around that array key ($links['my_link']).

Print theme

Can someone explain how to use this piece of function? I would like to print non links in menu, but can't figure out how to make this work. How to trigger this code?

else if (!empty($link['title'])) {
        // Some links are actually not links, but we wrap these in <span> for adding title and class attributes
        if (empty($link['html'])) {
          $link['title'] = check_plain($link['title']);
        }
        $span_attributes = '';
        if (isset($link['attributes'])) {
          $span_attributes = drupal_attributes($link['attributes']);
        }
        $output .= '<span' . $span_attributes . '>' . $link['title'] . '</span>';
      }

Not

Theme_links is NOT a menu function. I'm not even sure menu.inc uses this theme function.

This kind of question belongs in the forums.

Login or register to post comments