You are here

function menu_CrumbsMultiPlugin_hierarchy::findParent in Crumbs, the Breadcrumbs suite 7.2

Same name and namespace in other branches
  1. 7 plugins/crumbs.menu.inc \menu_CrumbsMultiPlugin_hierarchy::findParent()

Find candidates for the parent path.

Parameters

string $path: The path that we want to find a parent for.

array $item: Item as returned from crumbs_get_router_item()

Return value

array Parent path candidates

Overrides crumbs_MultiPlugin_FindParentInterface::findParent

File

plugins/crumbs.menu.inc, line 53

Class

menu_CrumbsMultiPlugin_hierarchy

Code

function findParent($path, $item) {

  // Support for special_menu_items module.

  /* @see crumbs_menu() */

  /* @see menu_link_load() */
  if ('crumbs/special-menu-item/%' === $item['route']) {
    return $this
      ->specialMenuItemFindParent($item);
  }
  $q = db_select('menu_links', 'child');

  // Join the parent item, but allow for toplevel items without a parent.
  $q
    ->leftJoin('menu_links', 'parent', 'parent.mlid = child.plid');
  $q
    ->addExpression('parent.link_path', 'parent_path');
  $q
    ->addExpression('child.menu_name', 'menu_name');
  $q
    ->addExpression('child.plid', 'plid');
  $q
    ->condition('child.link_path', $path);
  if (module_exists('i18n_menu')) {

    // Filter and sort by language.
    // The 'language' column only exists if i18n_menu is installed.
    // (See i18n_menu_install())
    $language = LANGUAGE_NONE;
    if (isset($GLOBALS['language'])) {
      $language = array(
        $language,
        $GLOBALS['language']->language,
      );
    }
    $q
      ->condition('child.language', $language);
  }

  // Top-level links have higher priority.
  $q
    ->orderBy('child.depth', 'ASC');

  // Collect candidates for the parent path, keyed by menu name.
  $candidates = array();
  foreach ($q
    ->execute() as $row) {
    if (!array_key_exists($row->menu_name, $candidates)) {
      if ('<separator>' === $row->parent_path) {

        // Ignore separator menu items added by special_menu_items.
        continue;
      }
      if ('<nolink>' === $row->parent_path) {
        $candidates[$row->menu_name] = 'crumbs/special-menu-item/' . $row->plid;
      }
      else {

        // This may add NULL values for toplevel items.
        $candidates[$row->menu_name] = $row->parent_path;
      }
    }
  }

  // Filter out NULL values for toplevel items.
  return array_filter($candidates);
}