You are here

i18n_menu_overview.module in Menu per language - i18n menu overview 7.3

Same filename and directory in other branches
  1. 7.2 i18n_menu_overview.module

menu language module file displays menus per language

File

i18n_menu_overview.module
View source
<?php

/**
 * @file
 * menu language module file
 * displays menus per language
 */
define('I18N_MENU_OVERVIEW', 'i18n_menu_overview');
define('I18N_MENU_OVERVIEW_DEFAULT_NAME', 'default');
define('I18N_MENU_OVERVIEW_LOCAL_ACTION', 'local_action');
define('I18N_MENU_OVERVIEW_MENU_LISTING', 'menu_listing');
define('I18N_MENU_OVERVIEW_ADMIN_SETTING_DETAIL_MENU', 'i18n_menu_overview_type_of_detail_overview');
define('I18N_MENU_OVERVIEW_ADMIN_SETTING_STUCTURE_OVERVIEW', 'i18n_menu_overview_type_of_structure_overview');
define('I18N_MENU_OVERVIEW_FILTER_IMAGE', 'https://www.drupal.org/files/Screen%20Shot%202016-01-12%20at%2007.26.29.png');
define('I18N_MENU_OVERVIEW_COLLAPSE_IMAGE', 'https://www.drupal.org/files/Screen%20Shot%202016-01-13%20at%2016.41.14.png');
include_once 'i18n_menu_overview.permissions.inc';
include_once 'i18n_menu_overview.contextual_link.inc';
include_once 'i18n_menu_overview.menu_settings.inc';

/**
 * Implements hook_permission().
 */
function i18n_menu_overview_permission() {
  $menus = _i18n_menu_overview_get_enabled_menus();
  $enabled_i18n_menu_overviews = i18n_language_list();
  $permissions = array(
    'administer all i18n menu overview' => array(
      'title' => t('Administer all i18n menus'),
    ),
  );

  // Make permissions for all the enabled languages.
  foreach ($enabled_i18n_menu_overviews as $menu_language => $language_name) {
    if (!empty($menus)) {
      foreach ($menus as $menu) {
        $permissions['administer ' . $menu . '_' . $menu_language] = array(
          'title' => t('Administer the menu:') . $menu . ' ' . t('in') . ' ' . $menu_language,
        );
      }
    }
  }
  return $permissions;
}

/**
 * Implements hook_menu().
 *
 * @return array
 *   arr menu items
 */
function i18n_menu_overview_menu() {
  global $language;
  $menus = _i18n_menu_overview_get_enabled_menus();
  $enabled_i18n_menu_overviews = i18n_language_list();
  $type_of_menu_listing = variable_get('i18n_menu_overview_type_of_structure_overview', I18N_MENU_OVERVIEW_DEFAULT_NAME);
  $i18n_menu_overview_type_of_detail_overview = variable_get(I18N_MENU_OVERVIEW_ADMIN_SETTING_DETAIL_MENU, I18N_MENU_OVERVIEW_DEFAULT_NAME);

  // Shows all the enabled menus in the enabled languages.
  foreach ($enabled_i18n_menu_overviews as $menu_language => $language_name) {
    if (!empty($menus)) {
      foreach ($menus as $localized_menu_name => $menu) {
        $current_menu_per_language_name = 'admin/structure/' . $menu . '_' . $menu_language;
        $items[$current_menu_per_language_name] = array(
          'title' => ucfirst($localized_menu_name) . ' : ' . $menu_language,
          'description' => 'This is the ' . $localized_menu_name . ' edit page for language : ' . $menu_language,
          'page callback' => 'drupal_get_form',
          'page arguments' => array(
            'i18n_menu_overview_menulanguage_form',
            $menu,
            $menu_language,
          ),
          'file' => 'i18n_menu_overview_form.inc',
          'access callback' => '_i18n_menu_overview_menu_access',
          'access arguments' => array(
            'administer ' . $menu . '_' . $menu_language,
          ),
          'type' => MENU_NORMAL_ITEM,
        );
        if ($type_of_menu_listing != I18N_MENU_OVERVIEW_DEFAULT_NAME) {
          if ($type_of_menu_listing == I18N_MENU_OVERVIEW_LOCAL_ACTION) {
            $items['admin/structure/' . $menu . '_' . $menu_language]['type'] = MENU_LOCAL_ACTION;
          }
          else {
            $items['admin/structure/' . $menu . '_' . $menu_language]['type'] = MENU_SUGGESTED_ITEM;

            // Just on menu item on the structure page.
            if ($menu_language == $language->language) {
              $items['admin/structure/' . $menu . '_' . $menu_language] = array(
                'title' => t('i18n:') . ' ' . ucfirst($localized_menu_name),
                'description' => 'This is the i18n ' . $localized_menu_name . ' edit page',
                'page callback' => 'drupal_get_form',
                'page arguments' => array(
                  'i18n_menu_overview_menulanguage_form',
                  $menu,
                  $menu_language,
                ),
                'file' => 'i18n_menu_overview_form.inc',
                'access callback' => '_i18n_menu_overview_menu_access',
                'access arguments' => array(
                  'administer ' . $menu . '_' . $menu_language,
                ),
                'type' => MENU_NORMAL_ITEM,
              );
            }
          }
        }

        // Shows tabs on the per language menu page to switch to other langs.
        foreach ($enabled_i18n_menu_overviews as $other_menu_language => $language_name) {
          if ($other_menu_language != $menu_language) {
            $items['admin/structure/' . $menu . '_' . $menu_language . '/tab_' . $menu . '_' . $other_menu_language] = array(
              'title' => ucfirst($localized_menu_name) . ' : ' . $other_menu_language,
              'page callback' => '_i18n_menu_overview_goto_menu',
              'page arguments' => array(
                $menu,
                $other_menu_language,
              ),
              'access callback' => '_i18n_menu_overview_menu_access',
              'access arguments' => array(
                'administer ' . $menu . '_' . $other_menu_language,
              ),
              'type' => MENU_LOCAL_TASK,
            );
            if ($i18n_menu_overview_type_of_detail_overview == I18N_MENU_OVERVIEW_MENU_LISTING) {
              $items['admin/structure/' . $menu . '_' . $menu_language . '/tab_' . $menu . '_' . $other_menu_language]['type'] = MENU_NORMAL_ITEM;
            }
            if ($i18n_menu_overview_type_of_detail_overview == I18N_MENU_OVERVIEW_LOCAL_ACTION) {
              $items['admin/structure/' . $menu . '_' . $menu_language . '/tab_' . $menu . '_' . $other_menu_language]['type'] = MENU_LOCAL_ACTION;
            }
          }
          else {

            // The lang where you are in.
            $items['admin/structure/' . $menu . '_' . $menu_language . '/tab_' . $menu . '_' . $menu_language] = array(
              'title' => ucfirst($localized_menu_name) . ' : ' . $other_menu_language,
              'type' => MENU_DEFAULT_LOCAL_TASK,
            );

            //if ($i18n_menu_overview_type_of_detail_overview == I18N_MENU_OVERVIEW_MENU_LISTING) {

            //  $items['admin/structure/' . $menu . '_' . $enabled_mnu_language . '/tab_' . $menu . '_' . $enabled_mnu_language]['type'] = MENU_NORMAL_ITEM;

            //}
            if ($i18n_menu_overview_type_of_detail_overview == I18N_MENU_OVERVIEW_LOCAL_ACTION) {
              $items['admin/structure/' . $menu . '_' . $menu_language . '/tab_' . $menu . '_' . $menu_language]['type'] = MENU_LOCAL_ACTION;
            }
          }
        }
      }
    }
  }

  // Admin section.
  $items['admin/config/regional/i18n_menu_overview'] = array(
    'title' => 'i18n Menu overview',
    'description' => 'Configure the i18n menu per language module.',
    'position' => 'left',
    'weight' => -20,
    'page callback' => 'system_admin_menu_block_page',
    'access arguments' => array(
      'administer site configuration',
    ),
    'file' => 'system.admin.inc',
    'file path' => drupal_get_path('module', 'system'),
  );
  $items['admin/config/regional/i18n_menu_overview/config'] = array(
    'title' => 'i18n Menu overview configuration',
    'description' => 'Configure menu per language module.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'i18n_menu_overview_settings',
    ),
    'access arguments' => array(
      'administer site configuration',
    ),
    'file' => 'i18n_menu_overview.admin.inc',
  );
  return $items;
}

/**
 * Implements hook_theme().
 */
function i18n_menu_overview_theme() {
  return array(
    'i18n_menu_overview_menulanguage_form' => array(
      'render element' => 'form',
      'file' => 'i18n_menu_overview_form.inc',
    ),
    'i18n_menu_overview_page' => array(
      'variables' => array(
        'language_id' => NULL,
        'menu' => NULL,
        'table' => NULL,
        'remaining_form_elements' => NULL,
      ),
      'template' => 'theme/i18n_menu_overview_page',
    ),
  );
}

/**
 * Gets the given menu for the gven language using the Q builder.
 *
 * Array @param $enabled_language
 *   enabled langs
 *
 * @param string $which_menu
 *   which menu u want to use
 *
 * Defaults  * menu = main-menu
 */
function i18n_menu_overview_get_menu_links_by_language($enabled_language, $which_menu = "main-menu") {
  $query = db_select('menu_links', 'ml');

  // Fields: which fields I need: see below which fields..
  $query
    ->fields('m', array(
    'load_functions',
    'to_arg_functions',
    'access_callback',
    'access_arguments',
    'page_callback',
    'page_arguments',
    'delivery_callback',
    'title',
    'title_callback',
    'title_arguments',
    'type',
    'description',
  ));
  $query
    ->fields('ml');

  // Conditions added to the query for the language and the selected menu.
  $query
    ->condition('ml.language', $enabled_language, '=');
  $query
    ->condition('ml.menu_name', $which_menu, '=');

  // Joins: join with the menu router..
  $query
    ->leftJoin('menu_router', 'm', 'm.path = ml.router_path');

  // Ordering my query based on the tree (the menu tree).
  $query
    ->orderBy('p1', 'ASC');
  $query
    ->orderBy('p2', 'ASC');
  $query
    ->orderBy('p3', 'ASC');
  $query
    ->orderBy('p4', 'ASC');
  $query
    ->orderBy('p5', 'ASC');
  $query
    ->orderBy('p6', 'ASC');
  $query
    ->orderBy('p7', 'ASC');
  $query
    ->orderBy('p8', 'ASC');
  $query
    ->orderBy('p9', 'ASC');

  // Execute it.
  return $query
    ->execute();
}

/**
 * Gets all the enabled menus.
 * @return array
 *   arr language enabled menus
 */
function _i18n_menu_overview_get_enabled_menus() {
  $menus = menu_get_menus();
  $i18n_menu_overview_enabled_menus = NULL;
  foreach ($menus as $menu => $localized_menu_name) {
    $is_enabled_menu = variable_get('i18n_menu_overview_' . str_replace(' ', '_', $menu), FALSE);
    if ($is_enabled_menu) {
      $i18n_menu_overview_enabled_menus[$localized_menu_name] = $menu;
    }
  }
  return $i18n_menu_overview_enabled_menus;
}

/**
 * MenuItem @param $menu LanguageString @param $enabled_mnu_language.
 */
function _i18n_menu_overview_goto_menu($menu, $enabled_mnu_language) {
  drupal_goto('admin/structure/' . $menu . '_' . $enabled_mnu_language);
}

/**
 * Implementation of hook_menu_alter()
 */
function i18n_menu_overview_menu_alter(&$items) {
  $items['admin/structure/menu']['page callback'] = '_i18n_menu_overview_menu_overview_page';
  $items['admin/structure/menu']['access callback'] = '_i18n_menu_overview_access';
  unset($items['admin/structure/menu']['access arguments']);
  $items['admin/structure/menu/manage/%menu']['access callback'] = '_i18n_menu_overview_menu_access';
  $items['admin/structure/menu/manage/%menu']['access arguments'] = array(
    4,
  );
  $items['admin/structure/menu/manage/%menu/add']['access callback'] = '_i18n_menu_overview_menu_access';
  $items['admin/structure/menu/manage/%menu/add']['access arguments'] = array(
    4,
  );
  $items['admin/structure/menu/manage/%menu/translate']['access callback'] = '_i18n_menu_overview_menu_access';
  $items['admin/structure/menu/manage/%menu/translate']['access arguments'] = array(
    4,
  );
  $items['admin/structure/menu/item/%menu_link/edit']['access callback'] = '_i18n_menu_overview_menu_link_access';
  $items['admin/structure/menu/item/%menu_link/edit']['access arguments'] = array(
    4,
  );
  $items['admin/structure/menu/item/%menu_link/reset']['access callback'] = '_i18n_menu_overview_menu_link_access';
  $items['admin/structure/menu/item/%menu_link/reset']['access arguments'] = array(
    4,
  );
  $items['admin/structure/menu/item/%menu_link/delete']['access callback'] = '_i18n_menu_overview_menu_link_access';
  $items['admin/structure/menu/item/%menu_link/delete']['access arguments'] = array(
    4,
  );
  $items['admin/structure/menu/item/%menu_link/translate']['access callback'] = '_i18n_menu_overview_menu_link_access';
  $items['admin/structure/menu/item/%menu_link/translate']['access arguments'] = array(
    4,
  );

  // This will unset the default menu link generated by Drupal.

  //$i18n_menu_overview_hide_default_menu_link = variable_get('i18n_menu_overview_hide_default_menu_link', TRUE);

  //if ($i18n_menu_overview_hide_default_menu_link) {

  //unset($items['admin/structure/menu/manage/%menu']);

  //}
}

/**
 * Implements hook_form_ID_alter().
 *
 * Alters the add a link form to change the language to the language of the
 * menu your are editing.
 */
function i18n_menu_overview_form_menu_edit_item_alter(&$form, $form_state) {
  $query_params = drupal_get_query_parameters();
  if (empty($query_params['language_id'])) {
    return;
  }
  $form['i18n']['language']['#default_value'] = $query_params['language_id'];
}

/**
 * Alter the menu_edit_item form so that my hook runs last.
 *
 * @param $implementations
 * @param $hook
 */
function i18n_menu_overview_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    $module_name = 'i18n_menu_overview';
    if (isset($implementations[$module_name])) {
      $group = $implementations[$module_name];
      unset($implementations[$module_name]);
      $implementations[$module_name] = $group;
    }
  }
}

/**
 * Implements hook_query_TAG_alter().
 *
 * Alter preferred_menu_links add a language filter.
 */
function i18n_menu_overview_query_preferred_menu_links_alter(QueryAlterableInterface $query) {
  $fix_active_trail = variable_get('i18n_menu_overview_active_trail_fix', FALSE);
  if ($fix_active_trail) {

    // To make sure we only touch menu links.
    $fields = $query
      ->getFields();
    $tables = $query
      ->getTables();
    if (isset($fields['link_weight']) && $fields['link_weight']['alias'] == 'link_weight' && isset($tables['m']) && $tables['m']['table'] == 'menu_router') {
      global $language;
      $query
        ->condition('ml.language', $language->language);
    }
  }
}

/**
 * Because the above isn't sufficient when there are multiple same language
 * links with the same path this is required to check for current domain.
 */
function i18n_menu_overview_menu_block_tree_alter(&$tree, $config) {
  $fix_active_trail = variable_get('i18n_menu_overview_active_trail_fix', FALSE);
  if ($fix_active_trail) {
    $active_path = menu_tree_get_path($config['menu_name']);
    if ($item = menu_get_item($active_path)) {
      global $language;
      $current_path = $item['path'];
      $current_language = $language->language;
      i18n_menu_overview_parse_menu($tree, $current_path, $current_language);
    }
  }
}

/**
 * Helper function to traverse the menu and set the active trail correctly.
 *
 * @param $tree
 * @param $current_path
 * @param $current_language
 *
 * @return bool
 */
function i18n_menu_overview_parse_menu(&$tree, $current_path, $current_language) {
  foreach ($tree as $link_item => &$link_value) {
    if ($link_value['link']['link_path'] == $current_path) {
      $link_value['link']['in_active_trail'] = TRUE;
      return TRUE;
    }
    if (!empty($link_value['below']) && $link_value['link']['language'] == $current_language) {
      $feedback = i18n_menu_overview_parse_menu($link_value['below'], $current_path, $current_language);

      // Also set parent active_trail.
      if ($feedback) {
        $link_value['link']['in_active_trail'] = TRUE;
      }
    }
  }
}

/**
 * Gets the path to the jquery_filter_table library.
 *
 * String @return
 *   The path to the jquery_filter_table library js file, or FALSE if not found.
 */
function i18n_menu_overview_library_path_filtertable() {
  $library_path = libraries_get_path('jquery_filtertable');
  if (!empty($library_path)) {
    return $library_path . '/jquery.filtertable.js';
  }
  return FALSE;
}

/**
 * Gets the path to the BindWithDelay library.
 *
 * String @return
 *   The path to the BindWithDelay library js file, or FALSE if not found.
 */
function i18n_menu_overview_library_path_bindwithdelay() {
  $library_path = libraries_get_path('bind_with_delay');
  if (!empty($library_path)) {
    return $library_path . '/bindWithDelay.js';
  }
  return FALSE;
}

/**
 * Gets the path to the jquery.treetable.js library.
 *
 * String @return
 *   The path to the jquery.treetable.js library js file, or FALSE if not found.
 */
function i18n_menu_overview_library_path_collapsible_table() {
  $library_path = libraries_get_path('jquery_treetable');
  if (!empty($library_path)) {
    return $library_path . '/jquery.treetable.js';
  }
  return FALSE;
}

Functions

Namesort descending Description
i18n_menu_overview_form_menu_edit_item_alter Implements hook_form_ID_alter().
i18n_menu_overview_get_menu_links_by_language Gets the given menu for the gven language using the Q builder.
i18n_menu_overview_library_path_bindwithdelay Gets the path to the BindWithDelay library.
i18n_menu_overview_library_path_collapsible_table Gets the path to the jquery.treetable.js library.
i18n_menu_overview_library_path_filtertable Gets the path to the jquery_filter_table library.
i18n_menu_overview_menu Implements hook_menu().
i18n_menu_overview_menu_alter Implementation of hook_menu_alter()
i18n_menu_overview_menu_block_tree_alter Because the above isn't sufficient when there are multiple same language links with the same path this is required to check for current domain.
i18n_menu_overview_module_implements_alter Alter the menu_edit_item form so that my hook runs last.
i18n_menu_overview_parse_menu Helper function to traverse the menu and set the active trail correctly.
i18n_menu_overview_permission Implements hook_permission().
i18n_menu_overview_query_preferred_menu_links_alter Implements hook_query_TAG_alter().
i18n_menu_overview_theme Implements hook_theme().
_i18n_menu_overview_get_enabled_menus Gets all the enabled menus.
_i18n_menu_overview_goto_menu MenuItem

Constants