You are here

function lang_dropdown_form in Language Switcher Dropdown 7.2

Same name and namespace in other branches
  1. 6 lang_dropdown.module \lang_dropdown_form()
  2. 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;
}