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)

Returns HTML for a set of links.

Parameters

$links: An associative array of links to be themed. The key for each link is used as its CSS class. Each link should be itself an array, with the following elements:

  • title: The link text.
  • href: The link URL. If omitted, the 'title' is shown as a plain text item in the links list.
  • html: (optional) Whether or not 'title' is HTML. If set, the title will not be passed through check_plain().
  • attributes: (optional) Attributes for the anchor, or for the <span> tag used in its place if no 'href' is supplied.

If the 'href' element is supplied, the entire link array is passed to l() as its $options parameter.

$attributes: An associative array of attributes for the UL containing the list of links.

Return value

A string containing an unordered list of links.

Related topics

11 theme calls to theme_links()

File

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

Code

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