You are here

function lang_dropdown_form in Language Switcher Dropdown 7

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

Code

function lang_dropdown_form($form, &$form_state, $languages, $type) {
  global $language_url;
  $settings = _lang_dropdown_get_settings($type);
  if ($settings['js_widget'] == 2 && !_get_chosen_path()) {
    return array();
  }
  $module_path = drupal_get_path('module', 'lang_dropdown');
  $options = $js_settings = $hidden_elements = array();
  $selected_option_language_icon = '';
  $hidden_elements['lang_dropdown_type'] = array(
    '#type' => 'hidden',
    '#default_value' => check_plain($type),
  );
  $language_names = locale_language_list('native');

  // Support Domain access
  if ($domain_locale_exists = module_exists('domain_locale')) {
    global $_domain;
    $domain_languages = domain_locale_lookup($_domain['domain_id']);
  }

  // Now we iterate on $languages to build the needed options for the select element.
  foreach ($languages->links as $lang_code => $lang_options) {

    // language icons module add language when negotiation is session so be careful
    // we need to get rid of that language icons bug by checking for native property
    $language_object = isset($lang_options['language']) && isset($lang_options['language']->native) ? $lang_options['language'] : NULL;

    // 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 (!isset($lang_options['href']) && !$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],
    );

    // Set the selected option to be ready for #default_value in select form element.
    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)) {
      $selected_option = $lang_code;

      // Icon for the selected language
      if (module_exists('languageicons') && !$settings['js_widget']) {
        $selected_option_language_icon = theme('languageicons_icon', array(
          'language' => (object) array(
            'language' => $lang_code,
          ),
          'title' => $language_names[$lang_code],
        ));
      }
    }

    // Now we build our hidden form inputs to handle the redirections.
    $href = isset($lang_options['href']) && $settings['tohome'] == 0 ? $lang_options['href'] : '<front>';
    $hidden_elements[$lang_code] = array(
      '#type' => 'hidden',
      '#default_value' => check_plain(url($href, array(
        'language' => $language_object,
        'query' => isset($lang_options['query']) ? $lang_options['query'] : '',
      ))),
    );

    // Handle flags with Language icons module using JS widget.
    if (module_exists('languageicons') && $settings['js_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));
    }
  }

  // Add required files and settings for JS widget.
  if ($settings['js_widget'] == 1) {
    drupal_add_js($module_path . '/msdropdown/js/msdropdown/jquery.dd.min.js');
    $js_settings += array(
      'widget' => 'msdropdown',
      'visibleRows' => $settings['js_widget_settings']['visible_rows'],
      'roundedCorner' => $settings['js_widget_settings']['rounded'],
      'animStyle' => $settings['js_widget_settings']['animation'],
      'event' => $settings['js_widget_settings']['event'],
    );
    drupal_add_css($module_path . '/msdropdown/css/msdropdown/dd.css');
    $selected_skin = $settings['js_widget_settings']['skin'];
    if ($selected_skin == 'custom') {
      $custom_skin = check_plain($settings['js_widget_settings']['custom_skin']);
      drupal_add_css($module_path . '/msdropdown/css/msdropdown/' . $custom_skin . '.css');
      $js_settings += array(
        'mainCSS' => $custom_skin,
      );
    }
    else {
      $skins = _lang_dropdown_get_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');
  }
  else {
    if ($settings['js_widget'] == 2) {
      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');
    }
  }
  $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(
      'style' => 'width:' . $settings['js_widget_settings']['width'] . 'px',
      'class' => array(
        'lang-dropdown-select-element',
      ),
      'id' => 'lang-dropdown-select-' . $type,
    ),
    '#attached' => array(
      'js' => array(
        $module_path . '/lang_dropdown.js',
      ),
      'css' => $settings['js_widget'] ? array() : array(
        $module_path . '/lang_dropdown.css',
      ),
    ),
  );
  if (empty($hidden_elements)) {
    return array();
  }
  $form += $hidden_elements;
  if (module_exists('languageicons')) {
    $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;
  $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;
}