View source
<?php
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';
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'),
),
);
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;
}
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);
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;
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,
);
}
}
}
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 {
$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_LOCAL_ACTION) {
$items['admin/structure/' . $menu . '_' . $menu_language . '/tab_' . $menu . '_' . $menu_language]['type'] = MENU_LOCAL_ACTION;
}
}
}
}
}
}
$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;
}
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',
),
);
}
function i18n_menu_overview_get_menu_links_by_language($enabled_language, $which_menu = "main-menu") {
$query = db_select('menu_links', 'ml');
$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');
$query
->condition('ml.language', $enabled_language, '=');
$query
->condition('ml.menu_name', $which_menu, '=');
$query
->leftJoin('menu_router', 'm', 'm.path = ml.router_path');
$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');
return $query
->execute();
}
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;
}
function _i18n_menu_overview_goto_menu($menu, $enabled_mnu_language) {
drupal_goto('admin/structure/' . $menu . '_' . $enabled_mnu_language);
}
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,
);
}
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'];
}
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;
}
}
}
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) {
$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);
}
}
}
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);
}
}
}
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);
if ($feedback) {
$link_value['link']['in_active_trail'] = TRUE;
}
}
}
}
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;
}
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;
}
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;
}