You are here

menu_block.sort.inc in Menu Block 7.3

Same filename and directory in other branches
  1. 6.2 menu_block.sort.inc
  2. 7.2 menu_block.sort.inc

Provides optional sorting of the active trail in the menu tree.

File

menu_block.sort.inc
View source
<?php

/**
 * @file
 * Provides optional sorting of the active trail in the menu tree.
 */

/**
 * Sort the active trail to the top of the tree.
 *
 * @param $tree
 *   array The menu tree to sort.
 * @return
 *   void
 */
function _menu_tree_sort_active_path(&$tree) {

  // To traverse the original tree down the active trail, we use a pointer.
  $current_level =& $tree;

  // Traverse the tree along the active trail.
  do {
    $next_level = $sort = $first_key = FALSE;
    foreach ($current_level as $key => &$value) {

      // Save the first key for later use.
      if (!$first_key) {
        $first_key = $key;
      }
      if ($current_level[$key]['link']['in_active_trail'] && $current_level[$key]['below']) {

        // Don't re-sort if its already sorted.
        if ($key != $first_key) {

          // Create a new key that will come before the first key.
          list($first_key, ) = explode(' ', $first_key);
          $first_key--;
          list(, $new_key) = explode(' ', $key, 2);
          $new_key = "{$first_key} {$new_key}";

          // Move the item to the new key.
          $current_level[$new_key] = $current_level[$key];
          unset($current_level[$key]);
          $key = $new_key;
          $sort = TRUE;

          // Flag sorting.
        }
        $next_level = $key;

        // Flag subtree.
        break;
      }
    }

    // Sort this level.
    if ($sort) {
      ksort($current_level);
    }

    // Continue in the subtree, if it exists.
    if ($next_level) {
      $current_level =& $current_level[$next_level]['below'];
    }
  } while ($next_level);
}

Functions

Namesort descending Description
_menu_tree_sort_active_path Sort the active trail to the top of the tree.