示例#1
0
 /**
  * {@inheritdoc}
  */
 public function buildForm(array $form, array &$form_state)
 {
     $active = \Drupal::linkGenerator()->getActive();
     $language_url = \Drupal::languageManager()->getLanguage(Language::TYPE_URL);
     $unique_id = uniqid();
     $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' => $this->type);
     $form['lang_dropdown_tohome'] = array('#type' => 'value', '#default_value' => $this->settings['tohome']);
     $language_objects = language_list();
     // 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 ($this->languages 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']) && !$this->settings['showall']) {
             continue;
         }
         // Build the options in an assosiative array, so it will be ready for #options in select form element.
         switch ($this->settings['display']) {
             case LANGDROPDOWN_DISPLAY_TRANSLATED:
                 $options += array($lang_code => t($language_objects[$lang_code]->name));
                 break;
             case LANGDROPDOWN_DISPLAY_NATIVE:
                 $options += array($lang_code => t($language_objects[$lang_code]->name, array(), array('langcode' => $lang_code)));
                 break;
             case LANGDROPDOWN_DISPLAY_LANGCODE:
                 $options += array($lang_code => $lang_code);
                 break;
             default:
                 $options += array($lang_code => t($language_objects[$lang_code]->name));
                 break;
         }
         // Identify selected language
         if (isset($lang_options['route_name'])) {
             $variables = array('options' => array());
             if (!empty($link['language'])) {
                 $variables['options']['language'] = $link['language'];
             }
             if ($lang_options['route_name'] == $active['route_name'] && (empty($variables['options']['language']) || $variables['options']['language']->id == $active['language']) && $lang_options['route_parameters'] == $active['parameters']) {
                 $language_selected = $lang_code;
             }
         } elseif (isset($lang_options['href'])) {
             $is_current_path = $lang_options['href'] == current_path() || $lang_options['href'] == '<front>' && drupal_is_front_page();
             $is_current_language = empty($lang_options['language']) || $lang_options['language']->id == $language_url->id;
             if ($is_current_path && $is_current_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;
         }
         // Now we build our hidden form inputs to handle the redirections.
         $href = isset($lang_options['href']) && $this->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));
         // Handle flags with Language icons module using JS widget.
         if (module_exists('languageicons') && $this->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') && !$this->settings['widget']) {
         $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 ($this->settings['widget'] == LANGDROPDOWN_MSDROPDOWN) {
         drupal_add_library('lang_dropdown', 'msdropdown');
         $js_settings += array('widget' => 'msdropdown', 'visibleRows' => $this->settings['msdropdown']['visible_rows'], 'roundedCorner' => $this->settings['msdropdown']['rounded'], 'animStyle' => $this->settings['msdropdown']['animation'], 'event' => $this->settings['msdropdown']['event']);
         $selected_skin = $this->settings['msdropdown']['skin'];
         if ($selected_skin == 'custom') {
             $custom_skin = check_plain($this->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($unique_id => array('jsWidget' => $js_settings))), 'setting');
     } else {
         if ($this->settings['widget'] == LANGDROPDOWN_CHOSEN) {
             drupal_add_library('lang_dropdown', 'chosen');
             $js_settings += array('widget' => 'chosen', 'disable_search' => $this->settings['chosen']['disable_search'], 'no_results_text' => $this->settings['chosen']['no_results_text']);
             drupal_add_js(array('lang_dropdown' => array($unique_id => array('jsWidget' => $js_settings))), 'setting');
         } else {
             if ($this->settings['widget'] == LANGDROPDOWN_DDSLICK) {
                 drupal_add_library('lang_dropdown', 'ddslick');
                 $selected_skin = $this->settings['ddslick']['skin'];
                 if ($selected_skin == 'custom') {
                     $custom_skin = check_plain($this->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' => $this->settings['width'], 'height' => $this->settings['ddslick']['ddslick_height'], 'showSelectedHTML' => $this->settings['ddslick']['showSelectedHTML'], 'imagePosition' => $this->settings['ddslick']['imagePosition']);
                 drupal_add_js(array('lang_dropdown' => array($unique_id => array('jsWidget' => $js_settings))), 'setting');
             }
         }
     }
     $this->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:' . $this->settings['width'] . 'px', 'class' => array('lang-dropdown-select-element'), 'id' => 'lang-dropdown-select-' . $unique_id), '#attached' => array('js' => array($module_path . '/js/lang_dropdown.js'), 'css' => $this->settings['widget'] ? array() : array($module_path . '/css/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', $this->type);
     $form['#attributes']['id'] = 'lang_dropdown_form_' . $unique_id;
     if ($this->settings['widget'] == LANGDROPDOWN_DDSLICK) {
         $form['#attributes']['class'][] = $ddsSkin;
     }
     $form['submit'] = array('#type' => 'submit', '#value' => t('Go'), '#prefix' => "<noscript><div>\n", '#suffix' => "\n</div></noscript>");
     return $form;
 }
示例#2
0
 /**
  * {@inheritdoc}
  */
 public function build()
 {
     // prevent erroneous configuration
     if ($this->configuration['widget'] == LANGDROPDOWN_MSDROPDOWN && !_lang_dropdown_get_msdropdown_path()) {
         return array();
     }
     if ($this->configuration['widget'] == LANGDROPDOWN_CHOSEN && !_lang_dropdown_get_chosen_path()) {
         return array();
     }
     if ($this->configuration['widget'] == LANGDROPDOWN_DDSLICK && !_lang_dropdown_get_ddslick_path()) {
         return array();
     }
     $build = array();
     $path = drupal_is_front_page() ? '<front>' : current_path();
     list(, $type) = explode(':', $this->getPluginId());
     $languages = language_negotiation_get_switch_links($type, $path);
     $user = \Drupal::currentUser();
     $roles = $user->getRoles();
     foreach ($languages->links as $langcode => $link) {
         $hide_language = true;
         foreach ($roles as $key => $role) {
             if (!isset($this->configuration['hidden_languages'][$role]) || !in_array($langcode, $this->configuration['hidden_languages'][$role])) {
                 $hide_language = false;
                 break;
             }
         }
         if ($hide_language) {
             unset($languages->links[$langcode]['href']);
             $languages->links[$langcode]['attributes']['class'][] = 'locale-untranslated';
         }
     }
     if (empty($languages->links)) {
         return array();
     }
     //$form = drupal_get_form('lang_dropdown_form', $languages, $type, $this->configuration);
     $lang_dropdown_form = new LanguageDropdownForm($languages->links, $type, $this->configuration);
     $form = \Drupal::formBuilder()->getForm($lang_dropdown_form);
     return array('lang_dropdown_form' => $form);
     if (!empty($languages->links)) {
         $build = array('#theme' => 'links__language_block', '#links' => $languages->links, '#attributes' => array('class' => array("language-dropdown-switcher-{$links->method_id}")));
     }
     return $build;
 }