function lang_dropdown_form in Language Switcher Dropdown 7.2
Same name and namespace in other branches
- 6 lang_dropdown.module \lang_dropdown_form()
- 7 lang_dropdown.module \lang_dropdown_form()
Function to build the select widget form.
1 string reference to 'lang_dropdown_form'
- lang_dropdown_block_view in ./
lang_dropdown.module - Implements hook_block_view().
File
- ./
lang_dropdown.module, line 538 - Language dropdown select module main file.
Code
function lang_dropdown_form($form, &$form_state, $languages, $type) {
global $language;
global $language_url;
$settings = _lang_dropdown_get_settings($type);
if ($settings['widget'] == LANG_DROPDOWN_MSDROPDOWN && !_lang_dropdown_get_msdropdown_path()) {
return array();
}
if ($settings['widget'] == LANG_DROPDOWN_CHOSEN && !_lang_dropdown_get_chosen_path()) {
return array();
}
if ($settings['widget'] == LANG_DROPDOWN_DDSLICK && !_lang_dropdown_get_ddslick_path()) {
return array();
}
$module_path = drupal_get_path('module', 'lang_dropdown');
$options = $js_settings = $hidden_elements = array();
$selected_option_language_icon = $language_selected = $language_session_selected = '';
$form['lang_dropdown_type'] = array(
'#type' => 'value',
'#default_value' => $type,
);
$form['lang_dropdown_tohome'] = array(
'#type' => 'value',
'#default_value' => $settings['tohome'],
);
switch ($settings['display']) {
case LANG_DROPDOWN_DISPLAY_TRANSLATED:
$language_names = locale_language_list();
break;
case LANG_DROPDOWN_DISPLAY_NATIVE:
$language_names = locale_language_list('native');
break;
case LANG_DROPDOWN_DISPLAY_LANGCODE:
$language_names = locale_language_list('language');
break;
default:
$language_names = locale_language_list('native');
break;
}
// Support Domain access.
if ($domain_locale_exists = module_exists('domain_locale')) {
global $_domain;
$domain_languages = domain_locale_lookup($_domain['domain_id']);
}
$language_objects = language_list();
// Now we iterate on $languages to build the needed options for
// the select element.
foreach ($languages->links as $lang_code => $lang_options) {
// The language is not enabled on this domain.
if ($domain_locale_exists && !array_key_exists($lang_code, $domain_languages)) {
continue;
}
// There is no translation for this language and not all languages are
// shown.
if (in_array('locale-untranslated', $lang_options['attributes']['class']) && !$settings['showall']) {
continue;
}
// Build the options in an assosiative array, so it will be ready for
// #options in select form element.
$options += array(
$lang_code => $language_names[$lang_code],
);
// Identify selected language.
if (isset($lang_options['href']) && ($lang_options['href'] == $_GET['q'] || $lang_options['href'] == '<front>' && drupal_is_front_page()) && (empty($lang_options['language']) || $lang_options['language']->language == $language_url->language)) {
$language_selected = $lang_code;
}
// Identify if session negotiation had set session-active class
// the trim is needed because of a bug in locale.inc, drupal
// version <7.24 at least.
if (in_array('session-active', array_map('trim', $lang_options['attributes']['class']))) {
$language_session_selected = $lang_code;
}
// In case no translated node go to no translated node and define selected language of non translated node.
if (!isset($lang_options['href'])) {
if (arg(0) == 'node' && is_numeric(arg(1))) {
$lang_options['href'] = 'node/' . arg(1);
}
$language_selected = $language->language;
}
// Now we build our hidden form inputs to handle the redirections.
$href = isset($lang_options['href']) && $settings['tohome'] == 0 ? $lang_options['href'] : '<front>';
if (!isset($lang_options['query'])) {
$lang_options['query'] = drupal_get_query_parameters();
}
$hidden_elements[$lang_code] = array(
'#type' => 'hidden',
'#default_value' => url($href, $lang_options + array(
'language' => $language_objects[$lang_code],
)),
);
// Handle flags with Language icons module using JS widget.
if (module_exists('languageicons') && !empty($settings['languageicons']['enable_icons']) && $settings['widget']) {
$languageicons_path = variable_get('languageicons_path', drupal_get_path('module', 'languageicons') . '/flags/*.png');
$js_settings['languageicons'][$lang_code] = file_create_url(str_replace('*', $lang_code, $languageicons_path));
}
}
// If session-active is set that's the selected language otherwise rely
// on $language_selected.
$selected_option = $language_session_selected == '' ? $language_selected : $language_session_selected;
// Icon for the selected language.
if (module_exists('languageicons') && !empty($selected_option) && !empty($settings['languageicons']['enable_icons']) && in_array($settings['widget'], array(
LANG_DROPDOWN_CHOSEN,
LANG_DROPDOWN_SIMPLE_SELECT,
))) {
$selected_option_language_icon = theme('languageicons_icon', array(
'language' => (object) array(
'language' => $selected_option,
),
'title' => $language_names[$selected_option],
));
}
// Add required files and settings for JS widget.
if ($settings['widget'] == LANG_DROPDOWN_MSDROPDOWN) {
drupal_add_library('lang_dropdown', 'msdropdown');
$js_settings += array(
'widget' => 'msdropdown',
'visibleRows' => $settings['msdropdown']['visible_rows'],
'roundedCorner' => $settings['msdropdown']['rounded'],
'animStyle' => $settings['msdropdown']['animation'],
'event' => $settings['msdropdown']['event'],
);
$selected_skin = $settings['msdropdown']['skin'];
if ($selected_skin == 'custom') {
$custom_skin = check_plain($settings['msdropdown']['custom_skin']);
drupal_add_css(_lang_dropdown_get_msdropdown_path() . '/css/msdropdown/' . $custom_skin . '.css');
$js_settings += array(
'mainCSS' => $custom_skin,
);
}
else {
$skins = _lang_dropdown_get_msdropdown_skins();
$skin_data = $skins[$selected_skin];
drupal_add_css($skin_data['file']);
$js_settings += array(
'mainCSS' => $skin_data['mainCSS'],
);
}
drupal_add_js(array(
'lang_dropdown' => array(
$type => array(
'jsWidget' => $js_settings,
),
),
), 'setting');
}
elseif ($settings['widget'] == LANG_DROPDOWN_CHOSEN) {
drupal_add_library('lang_dropdown', 'chosen');
$js_settings += array(
'widget' => 'chosen',
'disable_search' => $settings['chosen']['disable_search'],
'no_results_text' => $settings['chosen']['no_results_text'],
);
drupal_add_js(array(
'lang_dropdown' => array(
$type => array(
'jsWidget' => $js_settings,
),
),
), 'setting');
}
elseif ($settings['widget'] == LANG_DROPDOWN_DDSLICK) {
drupal_add_library('lang_dropdown', 'ddslick');
$selected_skin = $settings['ddslick']['skin'];
if ($selected_skin == 'custom') {
$custom_skin = check_plain($settings['ddslick']['custom_skin']);
drupal_add_css(_lang_dropdown_get_ddslick_path() . '/' . $custom_skin . '.css');
$ddsSkin = $custom_skin;
}
else {
$skins = _lang_dropdown_get_ddslick_skins();
$skin_data = $skins[$selected_skin];
drupal_add_css($skin_data['file']);
$ddsSkin = $selected_skin;
}
$js_settings += array(
'widget' => 'ddslick',
'width' => $settings['width'],
'height' => $settings['ddslick']['ddslick_height'],
'showSelectedHTML' => $settings['ddslick']['showSelectedHTML'],
'imagePosition' => $settings['ddslick']['imagePosition'],
);
drupal_add_js(array(
'lang_dropdown' => array(
$type => array(
'jsWidget' => $js_settings,
),
),
), 'setting');
}
$settings['languageicons']['flag_position'] ? $flag_position = '#suffix' : ($flag_position = '#prefix');
// Now we build the $form array.
$form['lang_dropdown_select'] = array(
'#type' => 'select',
'#default_value' => isset($selected_option) ? $selected_option : key($options),
'#options' => $options,
'#attributes' => array(
'class' => array(
'lang-dropdown-select-element',
),
'id' => 'lang-dropdown-select-' . $type,
),
'#attached' => array(
'js' => array(
$module_path . '/lang_dropdown.js',
),
'css' => in_array($settings['widget'], array(
LANG_DROPDOWN_CHOSEN,
LANG_DROPDOWN_SIMPLE_SELECT,
)) ? array(
$module_path . '/lang_dropdown.css',
) : array(),
),
);
if (!empty($settings['width'])) {
$form['lang_dropdown_select']['#attributes']['style'] = 'width:' . $settings['width'] . 'px';
}
if (empty($hidden_elements)) {
return array();
}
$form += $hidden_elements;
if (module_exists('languageicons') && !empty($settings['languageicons']['enable_icons'])) {
$form['lang_dropdown_select'][$flag_position] = $selected_option_language_icon;
}
$form['#attributes']['class'] = array(
'lang_dropdown_form',
$type,
);
$form['#attributes']['id'] = 'lang_dropdown_form_' . $type;
if ($settings['widget'] == LANG_DROPDOWN_DDSLICK) {
$form['#attributes']['class'][] = $ddsSkin;
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Go'),
// The below prefix & suffix for gracefull fallback if JavaScript
// was disabled.
'#prefix' => "<noscript><div>\n",
'#suffix' => "\n</div></noscript>",
);
return $form;
}