diff --git a/js/lang_dropdown.js b/js/lang_dropdown.js index e66cae2..311c4a6 100644 --- a/js/lang_dropdown.js +++ b/js/lang_dropdown.js @@ -6,22 +6,22 @@ Drupal.behaviors.lang_dropdown = { if (settings.lang_dropdown) { var flags, msddSettings; for (key in settings.lang_dropdown) { - msddSettings = settings.lang_dropdown[key].jsWidget; + msddSettings = settings.lang_dropdown[key]; flags = msddSettings.languageicons; if (flags) { $.each(flags, function(index, value) { if (msddSettings.widget == "msdropdown") { - $('select#lang-dropdown-select-' + key + ' option[value="' + index + '"]').attr('data-image', value); + $('select#lang-dropdown-select-' + msddSettings.key + ' option[value="' + index + '"]').attr('data-image', value); } else if (msddSettings.widget == "ddslick" && Boolean(msddSettings.showSelectedHTML)) { - $('select#lang-dropdown-select-' + key + ' option[value="' + index + '"]').attr('data-imagesrc', value); + $('select#lang-dropdown-select-' + msddSettings.key + ' option[value="' + index + '"]').attr('data-imagesrc', value); } }); } if (msddSettings.widget == "msdropdown") { try { - $('select#lang-dropdown-select-' + key).msDropDown({ + $('select#lang-dropdown-select-' + msddSettings.key).msDropDown({ visibleRows: msddSettings.visibleRows, roundedCorner: Boolean(msddSettings.roundedCorner), animStyle: msddSettings.animStyle, @@ -34,14 +34,14 @@ Drupal.behaviors.lang_dropdown = { } } else if (msddSettings.widget == "chosen") { - $('select#lang-dropdown-select-' + key).chosen({ + $('select#lang-dropdown-select-' + msddSettings.key).chosen({ disable_search: msddSettings.disable_search, no_results_text: msddSettings.no_results_text }); } else if (msddSettings.widget == "ddslick") { $.data(document.body, 'ddslick'+key+'flag', 0); - $('select#lang-dropdown-select-' + key).ddslick({ + $('select#lang-dropdown-select-' + msddSettings.key).ddslick({ width: msddSettings.width, height: (msddSettings.height == 0) ? null : msddSettings.height, showSelectedHTML: Boolean(msddSettings.showSelectedHTML), @@ -51,7 +51,7 @@ Drupal.behaviors.lang_dropdown = { if (i) { $.data(document.body, 'ddslick'+key+'flag', 0); var lang = data.selectedData.value; - var href = $('#lang-dropdown-select-'+key).parents('form').find('input[name="' + lang + '"]').val(); + var href = $('#lang-dropdown-select-' + msddSettings.key).parents('form').find('input[name="' + lang + '"]').val(); window.location.href = href; } $.data(document.body, 'ddslick'+key+'flag', 1); diff --git a/lang_dropdown.libraries.yml b/lang_dropdown.libraries.yml index 9b4d2be..45e520e 100644 --- a/lang_dropdown.libraries.yml +++ b/lang_dropdown.libraries.yml @@ -15,10 +15,10 @@ ms-dropdown: title: 'Marghoob Suleman Dropdown jquery library' website: 'https://github.com/marghoobsuleman/ms-Dropdown' js: - /sites/all/libraries/ms-Dropdown/js/msdropdown/jquery.dd.min.js: {} + /libraries/ms-Dropdown/js/msdropdown/jquery.dd.min.js: {} css: component: - /sites/all/libraries/ms-Dropdown/css/msdropdown/dd.css: {} + /libraries/ms-Dropdown/css/msdropdown/dd.css: {} dependencies: - core/jquery @@ -27,10 +27,10 @@ chosen: title: 'Chosen' website: http://harvesthq.github.com/chosen js: - /sites/all/libraries/chosen/chosen.jquery.min.js: {} + /libraries/chosen/chosen.jquery.min.js: {} css: component: - /sites/all/libraries/chosen/chosen.css: {} + /libraries/chosen/chosen.css: {} dependencies: - core/jquery @@ -39,6 +39,97 @@ ddslick: title: ddSlick website: http://designwithpc.com/Plugins/ddSlick js: - /sites/all/libraries/ddslick/jquery.ddslick.min.js: {} + /libraries/ddslick/jquery.ddslick.min.js: {} dependencies: - core/jquery + +#skins +ldsSkin: + version: 1.x + css: + theme: + css/msdropdown/ldsSkin.css: {} + +ldsSkinAfter: + version: 1.x + css: + theme: + css/msdropdown/ldsSkin.css: {} + +ldsSkinNoIcon: + version: 1.x + css: + theme: + css/msdropdown/ldsSkin.css: {} + +ldsSkinNoLabel: + version: 1.x + css: + theme: + css/msdropdown/ldsSkin.css: {} + +ldsDark: + version: 1.x + css: + theme: + css/msdropdown/ldsDark.css: {} + +ldsDarkAfter: + version: 1.x + css: + theme: + css/msdropdown/ldsDark.css: {} + +ldsDarkNoIcon: + version: 1.x + css: + theme: + css/msdropdown/ldsDark.css: {} + +ldsDarkNoLabel: + version: 1.x + css: + theme: + css/msdropdown/ldsDark.css: {} + +ldsBlue: + version: 1.x + css: + theme: + css/msdropdown/ldsBlue.css: {} + +ldsBlueAfter: + version: 1.x + css: + theme: + css/msdropdown/ldsBlue.css: {} + +ldsBlueNoIcon: + version: 1.x + css: + theme: + css/msdropdown/ldsBlue.css: {} + +ldsBlueNoLabel: + version: 1.x + css: + theme: + css/msdropdown/ldsBlue.css: {} + +ddsDefault: + version: 1.x + css: + theme: + css/ddslick/ddsDefault.css: {} + +ddsDark: + version: 1.x + css: + theme: + css/ddslick/ddsDark.css: {} + +ddsBlue: + version: 1.x + css: + theme: + css/ddslick/ddsBlue.css: {} diff --git a/lang_dropdown.module b/lang_dropdown.module index 6cfebf4..5cb3e22 100644 --- a/lang_dropdown.module +++ b/lang_dropdown.module @@ -68,7 +68,6 @@ function lang_dropdown_help($path, $arg) { } } - /** * Helper function to handle msdropdown skins data */ @@ -168,63 +167,3 @@ function _lang_dropdown_get_ddslick_skins() { ), ); } - -/** - * Get the location of the msdropdown library. - * - * @return - * The location of the library, or FALSE if the library isn't installed. - */ -function _lang_dropdown_get_msdropdown_path() { - $path = FALSE; - if (function_exists('libraries_get_path') && libraries_get_path('msdropdown')) { - $path = libraries_get_path('msdropdown'); - if (!file_exists($path)) { - $path = FALSE; - } - } - elseif (file_exists('sites/all/libraries/ms-Dropdown/js/msdropdown/jquery.dd.min.js')) { - $path = 'sites/all/libraries/ms-Dropdown'; - } - return $path; -} - -/** - * Get the location of the chosen library. - * - * @return - * The location of the library, or FALSE if the library isn't installed. - */ -function _lang_dropdown_get_chosen_path() { - $path = FALSE; - if (function_exists('libraries_get_path') && libraries_get_path('chosen')) { - $path = libraries_get_path('chosen'); - if (!file_exists($path)) { - $path = FALSE; - } - } - elseif (file_exists('sites/all/libraries/chosen/chosen.jquery.min.js')) { - $path = 'sites/all/libraries/chosen'; - } - return $path; -} - -/** - * Get the location of the ddslick library. - * - * @return - * The location of the library, or FALSE if the library isn't installed. - */ -function _lang_dropdown_get_ddslick_path() { - $path = FALSE; - if (function_exists('libraries_get_path') && libraries_get_path('ddslick')) { - $path = libraries_get_path('ddslick'); - if (!file_exists($path)) { - $path = FALSE; - } - } - elseif (file_exists('sites/all/libraries/ddslick/jquery.ddslick.min.js')) { - $path = 'sites/all/libraries/ddslick'; - } - return $path; -} diff --git a/src/Form/LanguageDropdownForm.php b/src/Form/LanguageDropdownForm.php index b273fbd..d87bfaa 100755 --- a/src/Form/LanguageDropdownForm.php +++ b/src/Form/LanguageDropdownForm.php @@ -54,7 +54,11 @@ class LanguageDropdownForm extends FormBase { $unique_id = uniqid(); - $options = $js_settings = $hidden_elements = array(); + $options = $hidden_elements = array(); + $js_settings = array( + 'key' => $unique_id, + ); + $selected_option_language_icon = $language_selected = $language_session_selected = ''; $form['lang_dropdown_type'] = array( @@ -78,7 +82,7 @@ class LanguageDropdownForm extends FormBase { 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; + //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; @@ -87,10 +91,10 @@ class LanguageDropdownForm extends FormBase { switch ($this->settings['display']) { case LANGDROPDOWN_DISPLAY_TRANSLATED: default: - $options += array($lang_code => $this->t($language_objects[$lang_code]->getName())); + $options += array($lang_code => $this->t($lang_options['language']->getName())); break; case LANGDROPDOWN_DISPLAY_NATIVE: - $options += array($lang_code => $lang_options['title']); + $options += array($lang_code => $lang_options['language']->getName()); break; case LANGDROPDOWN_DISPLAY_LANGCODE: $options += array($lang_code => $lang_code); @@ -132,7 +136,6 @@ class LanguageDropdownForm extends FormBase { $languageicons_path = $languageicons_config->get('path'); $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 @@ -149,8 +152,6 @@ class LanguageDropdownForm extends FormBase { // Add required files and settings for JS widget. if ($this->settings['widget'] == LANGDROPDOWN_MSDROPDOWN) { - $form['#attached']['library'][] = 'lang_dropdown/msdropdown'; - $js_settings += array( 'widget' => 'msdropdown', 'visibleRows' => $this->settings['msdropdown']['visible_rows'], @@ -162,51 +163,34 @@ class LanguageDropdownForm extends FormBase { $selected_skin = $this->settings['msdropdown']['skin']; if ($selected_skin == 'custom') { $custom_skin = Html::escape($this->settings['msdropdown']['custom_skin']); - drupal_add_css(_lang_dropdown_get_msdropdown_path() . '/css/msdropdown/' . $custom_skin . '.css'); + $form['#attached']['library'][] = 'ms-dropdown'; $js_settings += array( 'mainCSS' => $custom_skin, ); } else { $skins = _lang_dropdown_get_msdropdown_skins(); $skin_data = $skins[$selected_skin]; - drupal_add_css($skin_data['file']); + $form['#attached']['library'][] = 'lang_dropdown/' . $selected_skin; $js_settings += array( 'mainCSS' => $skin_data['mainCSS'], ); } - - drupal_add_js(array('lang_dropdown' => array( $unique_id => array('jsWidget' => $js_settings))), 'setting'); - + $form['#attached']['library'][] = 'lang_dropdown/ms-dropdown'; + $form['#attached']['drupalSettings']['lang_dropdown']['ms-dropdown'] = $js_settings; } 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'); - + $form['#attached']['library'][] = 'lang_dropdown/chosen'; + $form['#attached']['drupalSettings']['lang_dropdown']['chosen'] = $js_settings; } else if ($this->settings['widget'] == LANGDROPDOWN_DDSLICK) { - - drupal_add_library('lang_dropdown', 'ddslick'); - + $form['#attached']['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'], @@ -214,12 +198,13 @@ class LanguageDropdownForm extends FormBase { 'showSelectedHTML' => $this->settings['ddslick']['showSelectedHTML'], 'imagePosition' => $this->settings['ddslick']['imagePosition'], ); - - drupal_add_js(array('lang_dropdown' => array( $unique_id => array('jsWidget' => $js_settings))), 'setting'); - + $form['#attributes']['class'][] = ($selected_skin == 'custom') ? + Html::escape($this->settings['ddslick']['custom_skin']) : $selected_skin; + $form['#attached']['library'][] = 'lang_dropdown/' . $selected_skin; + $form['#attached']['drupalSettings']['lang_dropdown']['ddslick'] = $js_settings; } - ($this->settings['languageicons']['flag_position']) ? $flag_position = '#suffix' : $flag_position = '#prefix'; + $flag_position = ($this->settings['languageicons']['flag_position']) ? '#suffix' : '#prefix'; // Now we build the $form array. $form['lang_dropdown_select'] = array( @@ -245,13 +230,8 @@ class LanguageDropdownForm extends FormBase { $form['lang_dropdown_select'][$flag_position] = $selected_option_language_icon; } - $form['#attributes']['class'] = array('lang_dropdown_form', $this->type); + $form['#attributes']['class']['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'), diff --git a/src/Plugin/Block/LanguageDropdownBlock.php b/src/Plugin/Block/LanguageDropdownBlock.php index c2363f9..ad1a40f 100644 --- a/src/Plugin/Block/LanguageDropdownBlock.php +++ b/src/Plugin/Block/LanguageDropdownBlock.php @@ -207,7 +207,8 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI $form['lang_dropdown']['msdropdown']['#description'] = $this->t('This looks better with language icons module.', array(':link' => LANGDROPDOWN_LANGUAGEICONS_MOD_URL)); } - if (_lang_dropdown_get_msdropdown_path()) { + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'ms-dropdown'); + if (!empty($library)) { $num_rows = array(2, 3, 4, 5 , 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); $form['lang_dropdown']['msdropdown']['visible_rows'] = array( '#type' => 'select', @@ -266,7 +267,7 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI } else { // todo: fix instructions - $form['lang_dropdown']['msdropdown']['#description'] = $this->t('You need to download the Marghoob Suleman Dropdown JavaScript library and extract the entire contents of the archive into the %path directory on your server.', array(':link' => LANGDROPDOWN_MSDROPDOWN_URL, '%path' => 'sites/all/libraries')); + $form['lang_dropdown']['msdropdown']['#description'] = $this->t('You need to download the Marghoob Suleman Dropdown JavaScript library and extract the entire contents of the archive into the %path directory on your server.', array(':link' => LANGDROPDOWN_MSDROPDOWN_URL, '%path' => 'drupal_root/libraries')); $form['lang_dropdown']['msdropdown']['visible_rows'] = array( '#type' => 'hidden', '#value' => $this->configuration['msdropdown']['visible_rows'], @@ -334,7 +335,8 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI ), ); - if (!$this->moduleHandler->moduleExists('chosen') && _lang_dropdown_get_chosen_path()) { + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'chosen'); + if (!$this->moduleHandler->moduleExists('chosen') && !empty($library)) { $form['lang_dropdown']['chosen']['disable_search'] = array( '#type' => 'checkbox', '#title' => t('Disable search box'), @@ -366,7 +368,7 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI $form['lang_dropdown']['chosen']['#description'] = t('If you are already using the !chosenmod you must just choose to output language dropdown as a simple HTML select and allow Chosen module to turn it into a chosen style select.', array(':link' => LANGDROPDOWN_CHOSEN_MOD_URL)); } else { // todo: fix instructions - $form['lang_dropdown']['chosen']['#description'] = t('You need to download the Chosen library and extract the entire contents of the archive into the %path directory on your server.', array(':link' => LANGDROPDOWN_CHOSEN_WEB_URL, '%path' => 'sites/all/libraries')); + $form['lang_dropdown']['chosen']['#description'] = t('You need to download the Chosen library and extract the entire contents of the archive into the %path directory on your server.', array(':link' => LANGDROPDOWN_CHOSEN_WEB_URL, '%path' => 'drupal_root/libraries')); } } @@ -381,7 +383,8 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI ), ); - if (_lang_dropdown_get_ddslick_path()) { + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'ddslick'); + if (!empty($library)) { $form['lang_dropdown']['ddslick']['ddslick_height'] = array( '#type' => 'number', '#title' => t('Height'), @@ -545,38 +548,32 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI * Overrides \Drupal\block\BlockBase::blockValidate(). */ public function blockValidate($form, FormStateInterface $form_state) { - $widget = $form_state->getValue('lang_dropdown')['widget']; switch ($widget) { - case LANGDROPDOWN_MSDROPDOWN: - if (!_lang_dropdown_get_msdropdown_path()) { - $form_state->setError($form['settings']['lang_dropdown']['widget'], $this->t('You can\'t use Marghoob Suleman Dropdown output. You don\'t have the library installed.', array(':link' => LANGDROPDOWN_MSDROPDOWN_URL))); + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'ms-dropdown'); + if (empty($library) || (isset($library['js']) && !file_exists($library['js'][0]['data']))) { + $form_state->setErrorByName('settings', $this->t('You can\'t use Marghoob Suleman Dropdown output. You don\'t have the library installed.', array(':link' => LANGDROPDOWN_MSDROPDOWN_URL))); } break; case LANGDROPDOWN_CHOSEN: - if ($this->moduleHandler->moduleExists('chosen')) { - //$form_state->setError($form['settings']['lang_dropdown']['widget'], $this->t('You can\'t use !chosen output directly on language dropdown switcher. You have !chosenmod installed. Use simple HTML select as output and !chosenmod will render it with the !chosen library.', array('!chosen' => l(t('Chosen'), LANGDROPDOWN_CHOSEN_WEB_URL), '!chosenmod' => l(t('Chosen module'), LANGDROPDOWN_CHOSEN_MOD_URL)))); - } - else { - if (!_lang_dropdown_get_chosen_path()) { - //$form_state->setError($form['settings']['lang_dropdown']['widget'], $this->t('You can\'t use !chosen output. You don\'t have !chosen library installed.', array('!chosen' => l(t('Chosen'), LANGDROPDOWN_CHOSEN_WEB_URL)))); - } + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'chosen'); + if (empty($library) || (isset($library['js']) && !file_exists($library['js'][0]['data']))) { + $form_state->setErrorByName('settings', $this->t('You can\'t use Chosen output. You don\'t have the library installed.', array(':link' => LANGDROPDOWN_CHOSEN_MOD_URL))); } break; case LANGDROPDOWN_DDSLICK: - if (!_lang_dropdown_get_ddslick_path()) { - //$form_state->setError($form['settings']['lang_dropdown']['widget'], $this->t('You can\'t use !ddslick output. You don\'t have !ddslick library installed.', array('!ddslick' => l(t('ddSlick'), LANGDROPDOWN_DDSLICK_WEB_URL)))); + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'ddslick'); + if (empty($library) || (isset($library['js']) && !file_exists($library['js'][0]['data']))) { + $form_state->setErrorByName('settings', $this->t('You can\'t use ddSlick output. You don\'t have the library installed.', array(':link' => LANGDROPDOWN_DDSLICK_WEB_URL))); } break; - + default: break; - } - } /** @@ -626,19 +623,30 @@ class LanguageDropdownBlock extends BlockBase implements ContainerFactoryPluginI * {@inheritdoc} */ public function build() { + $library = array(); + switch ($this->configuration['widget']) { + case LANGDROPDOWN_MSDROPDOWN: + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'ms-dropdown'); + break; + + case LANGDROPDOWN_CHOSEN: + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'chosen'); + break; - // 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(); } + case LANGDROPDOWN_DDSLICK: + $library = \Drupal::service('library.discovery')->getLibraryByName('lang_dropdown', 'ddslick'); + break; + } + + if (empty($library) && ($this->configuration['widget'] != LANGDROPDOWN_SIMPLE_SELECT)) { + return array(); + } $route = $this->pathMatcher->isFrontPage() ? '' : ''; $url = Url::fromRoute($route); list(, $type) = explode(':', $this->getPluginId()); $languages = $this->languageManager->getLanguageSwitchLinks($type, $url); - $user = \Drupal::currentUser(); - $roles = $user->getRoles(); foreach ($languages->links as $langcode => $link) {