View source
<?php
namespace Drupal\select2_bef\Plugin\better_exposed_filters\filter;
use Drupal\better_exposed_filters\Plugin\better_exposed_filters\filter\FilterWidgetBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Plugin\views\filter\FilterPluginBase;
use Drupal\views\Plugin\views\filter\InOperator;
class Select2Boxes extends FilterWidgetBase {
public static function isApplicable($filter = NULL, array $filter_options = []) {
if ($filter instanceof InOperator) {
return TRUE;
}
return FALSE;
}
public function defaultConfiguration() {
return parent::defaultConfiguration() + [
'advanced' => [
'limited_search' => FALSE,
'minimum_search_length' => '',
'include_flags' => FALSE,
],
];
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$filter = $this->handler;
$filter_id = $this
->getExposedFilterFieldId();
$form = parent::buildConfigurationForm($form, $form_state);
if (empty($filter->options['expose']['multiple'])) {
$form['advanced']['limited_search'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Limit search box visibility by list length'),
'#default_value' => !empty($this->configuration['advanced']['limited_search']),
'#weight' => 10,
];
$form['advanced']['minimum_search_length'] = [
'#type' => 'textfield',
'#title' => $this
->t('Minimum list length'),
'#default_value' => $this->configuration['advanced']['minimum_search_length'],
'#weight' => 11,
'#states' => [
'visible' => [
[
':input[name="exposed_form_options[bef][filter][' . $filter_id . '][configuration][advanced][limited_search]"]' => [
'checked' => TRUE,
],
],
],
],
];
}
$this
->addIncludeIconsOption($form, $filter);
return $form;
}
public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
$filter = $this->handler;
$filter_id = $this
->getExposedFilterFieldId();
parent::exposedFormAlter($form, $form_state);
$form[$filter_id]['#type'] = 'select';
$form[$filter_id]['#attributes']['class'][] = 'select2-widget';
$form[$filter_id]['#attributes']['data-jquery-once-autocomplete'] = 'true';
$form[$filter_id]['#attributes']['data-select2-autocomplete-list-widget'] = 'true';
if (empty($filter->options['expose']['multiple'])) {
$form[$filter_id]['#multiple'] = FALSE;
if (!empty($this->configuration['advanced']['limited_search'])) {
$form[$filter_id]['#attributes']['data-minimum-search-length'] = $this->configuration['advanced']['minimum_search_length'];
}
}
else {
$form[$filter_id]['#attributes']['data-select2-multiple'] = 'true';
$form[$filter_id]['#multiple'] = TRUE;
}
if (!empty($this->configuration['advanced']['include_flags'])) {
$this
->includeIcons($form, $filter->definition, $filter_id);
}
$form[$filter_id]['#process'][] = [
'\\Drupal\\Core\\Render\\Element\\Select',
'processSelect',
];
$form[$filter_id]['#process'][] = [
'\\Drupal\\Core\\Render\\Element\\Select',
'processAjaxForm',
];
$form[$filter_id]['#pre_render'][] = [
'\\Drupal\\Core\\Render\\Element\\Select',
'preRenderSelect',
];
$form['#attached']['library'][] = 'select2boxes/widget';
}
protected function addIncludeIconsOption(array &$form, FilterPluginBase $filter) {
$applicable_fields = [
'Drupal\\views\\Plugin\\views\\filter\\LanguageFilter',
'Drupal\\country\\Plugin\\views\\filter\\CountryItem',
'Drupal\\address\\Plugin\\views\\filter\\Country',
];
foreach ($applicable_fields as $field) {
if (is_a($filter, $field)) {
if (\Drupal::moduleHandler()
->moduleExists('flags')) {
$form['advanced']['include_flags'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Include flags icons'),
'#default_value' => $this->configuration['advanced']['include_flags'],
];
}
}
}
}
protected static function includeIcons(array &$form, array $filter_definition, $key) {
$flags = [];
$field_name = isset($filter_definition['field_name']) ? $filter_definition['field_name'] : $filter_definition['entity field'];
$entity_type = $filter_definition['entity_type'];
$definition = \Drupal::service('entity_field.manager')
->getFieldStorageDefinitions($entity_type)[$field_name];
$mapper = !is_null($definition) && $definition
->getType() == 'country' ? \Drupal::service('flags.mapping.country') : \Drupal::service('flags.mapping.language');
foreach (array_keys($form[$key]['#options']) as $key) {
if ($key == '***LANGUAGE_language_interface***' || $key == '***LANGUAGE_site_default***') {
continue;
}
$flags[$key] = [
'flag',
'flag-' . $mapper
->map($key),
$mapper
->getExtraClasses()[0],
];
}
if (!isset($form['#attached']['drupalSettings']['flagsClasses'])) {
$form['#attached']['drupalSettings']['flagsClasses'] = [];
}
$form['#attached']['drupalSettings']['flagsClasses'] += $flags;
if (!isset($filter_definition['field'])) {
$filter_definition['field'] = $filter_definition['entity field'];
}
$form['#attached']['drupalSettings']['flagsFields'][$filter_definition['field']] = TRUE;
$form['#attached']['library'][] = 'flags/flags';
}
}