1

The default HTML structure of the primary links menu is not what I'd like it to be. How can I override it with my own version?

2

I am assuming you are working with drupal6 and you have basic understanding of variables and arrays. Default html structure of the primary links is formed at different places in drupal. First if you start with the wrapping div id, in your theme's page.tpl.php file where you print $primary_links change it as the following example:

 <div id="dk_one">
 <?php print theme('links', $primary_links, array('class' => 'links primary-links dk_two')) ?>
</div>

In order to change what is in $primary_links use the following code in template.php file of your theme.

    function yourThemeName_links($links, $attributes = array('class' => 'links')) {
  $output = '';

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

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

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

      // Automatically add a class to each link and also to each LI
      if (isset($link['attributes']) && isset($link['attributes']['class'])) {
        $link['attributes']['class'] .= 'dk_three ' . $key;
      }
      else {
        $link['attributes']['class'] = $key;
      }

      // Add first and last classes to the list of links to help out themers.
      $extra_class = '';
      if ($i == 1) {
        $extra_class .= 'first dk_four ';
      }
      if ($i == $num_links) {
        $extra_class .= 'last dk_five ';
      }
      $output .= '<li ' . drupal_attributes(array('class' => $extra_class . $class)) . '>';

      // Is the title HTML?
      $html = isset($link['html']) && $link['html'];

      // Initialize fragment and query variables.
      $link['query'] = isset($link['query']) ? $link['query'] : NULL;
      $link['fragment'] = isset($link['fragment']) ? $link['fragment'] : NULL;

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

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

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

  return $output;
}

Clear your cache and you will see dk_one dk_two dk_four dk_five div ids and classes in your html structure of your primary menu. Please let me know if it works for you.

| improve this answer | |
  • Actually it turned out the only thing I needed to get rid of was the title, so removed it by pasting <none> tag into the title field of the block. But despite of that your response was very informative and I will definitely use it in my future ramblings :) Thanks! – jayarjo Jun 24 '11 at 6:57
1

In drupal 7 it can be found at admin/structure/menu/settings and in Drupal 6 it can be found at admin/build/menu/settings

| improve this answer | |
  • Sorry, fixed the title - probably was misleading. – jayarjo Jun 23 '11 at 19:54
  • gotcha. Sorry. Misunderstood. Maybe someone will chime in. :) – user842 Jun 23 '11 at 19:59
  • Your advice turned useful after all ;) – jayarjo Jun 24 '11 at 6:55
  • I'm glad I could accidentally help.:) – user842 Jun 24 '11 at 14:42
1

Take a look at theme_menu_tree, theme_menu_item_link and theme_menu_item. Override these functions in your template.php file.

| improve this answer | |
  • settings.php?.. what is this? haven't stumbled upon it until now. – jayarjo Jun 24 '11 at 6:58
  • 4
    Theme's function overwrites should go in theme's template.php file. settings.php is for database connection information and other settings of drupal install so no theme related functions in settings.php – 15dk51 Jun 24 '11 at 7:37
  • Do not like to down vote people, please clarify what you've meant here, so that I can up vote you back. – jayarjo Jun 28 '11 at 7:38
  • @dkiscool, you're correct. That was a bit of a brief moment of insanity on my part. I meant template.php not settings.php – user1731 Jan 17 '12 at 23:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.