You are here

function menu_CrumbsMultiPlugin_link_title::findTitle in Crumbs, the Breadcrumbs suite 7.2

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

Find all menu links with $path as the link path. For each menu, find the one with the lowest depth.

Overrides crumbs_MultiPlugin_FindTitleInterface::findTitle

File

plugins/crumbs.menu.inc, line 159

Class

menu_CrumbsMultiPlugin_link_title

Code

function findTitle($path, $item) {

  // We need to load the original title from menu_router,
  // because _menu_item_localize() does a decision based on that, that we want
  // to reproduce.
  $q = db_select('menu_router', 'mr');
  $q
    ->condition('path', $item['path']);
  $q
    ->fields('mr', array(
    'title',
  ));
  $router_title = $q
    ->execute()
    ->fetchField();

  // Reproduce menu_link_load() with _menu_link_translate() and
  // _menu_item_localize(). However, a lot of information is already provided
  // in the $item argument, so we can skip these steps.
  $q = db_select('menu_links', 'ml');
  $q
    ->fields('ml');
  $q
    ->condition('link_path', $path);
  $q
    ->condition('router_path', $item['path']);

  // Top-level links have higher priority.
  $q
    ->orderBy('ml.depth', 'ASC');
  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
        ->addExpression('case ml.language when :language then 1 else 0 end', 'has_language', array(
        ':language' => LANGUAGE_NONE,
      ));
      $q
        ->orderBy('has_language');
    }
    $q
      ->condition('language', $language);
  }
  $result = $q
    ->execute();
  $titles = array();
  while ($row = $result
    ->fetchAssoc()) {
    if (!isset($titles[$row['menu_name']])) {
      $link = $row + $item;
      if ($row['link_title'] == $router_title) {

        // Use the localized title from menu_router.
        // Fortunately, this is already computed by menu_get_item().
        $link['title'] = $item['title'];
      }
      else {

        // Use the untranslated title from menu_links.
        $link['title'] = $row['link_title'];
      }
      if (!is_array($link['options'])) {

        // hook_translated_menu_link_alter() expects options to be an array.
        $link['options'] = unserialize($link['options']);
      }
      if (1 && module_exists('i18n_menu') && !function_exists('_i18n_menu_link_process')) {
        if (1 && isset($link['language']) && $link['language'] === LANGUAGE_NONE) {

          // i18n_menu_translated_menu_link_alter() in older versions of
          // i18n_menu expects $link['language'] to be empty for language
          // neutral.
          unset($link['language']);
        }

        // Give other modules (e.g. i18n_menu) a chance to alter the title.
        drupal_alter('translated_menu_link', $link, $item['map']);

        // i18n_menu < 7.x-1.8 sets the 'link_title' instead of 'title'.
        $titles[$row['menu_name']] = $link['link_title'];
      }
      else {

        // Give other modules (e.g. i18n_menu) a chance to alter the title.
        drupal_alter('translated_menu_link', $link, $item['map']);
        $titles[$row['menu_name']] = $link['title'];
      }
    }
  }
  return $titles;
}