diff --git a/modules/facets_exposed_filters/facets_exposed_filters.module b/modules/facets_exposed_filters/facets_exposed_filters.module index 2c02efb..5f0d700 100644 --- a/modules/facets_exposed_filters/facets_exposed_filters.module +++ b/modules/facets_exposed_filters/facets_exposed_filters.module @@ -44,3 +44,35 @@ function facets_exposed_filters_form_facets_facet_edit_form_alter(&$form, FormSt } } +function facets_exposed_filter_remove_validation($element, $form) { + // Because facet options get limited while filtering, we need to allow values + // which are not in the options list. + unset($element["#needs_validation"]); + return $element; +} + +function facets_exposed_filters_form_views_exposed_form_alter(&$form, FormStateInterface $form_state) { + // Ensure this code only triggers on views with exposed facet filters. + if ($form_state->get('uses_facets_exposed_filters')) { + // Add non-existing facet values as hidden fields, so they are not lost when + // a new filter is selected. + $user_input = $form_state->getUserInput(); + foreach ($user_input as $form_element_id => $values) { + if (!is_array($values)) { + continue; + } + if (isset($form[$form_element_id]["#options"])) { + foreach ($values as $value) { + // Check if any of the values is not in the option list (anymore). + if (!isset($form[$form_element_id]["#options"][$value])) { + $form['facets_hidden_' . $form_element_id] = [ + '#type' => 'hidden', + '#value' => $value, + '#attributes' => ['name' => $form_element_id . '[' . $value . ']'], + ]; + } + } + } + } + } +} diff --git a/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php b/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php index 0241793..7d2dff9 100644 --- a/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php +++ b/modules/facets_exposed_filters/src/Plugin/views/FacetsViewsPluginTrait.php @@ -69,6 +69,7 @@ trait FacetsViewsPluginTrait { '#type' => 'select', '#options' => $facet_build[0], '#multiple' => $this->options["expose"]["multiple"], + '#process' => ['facets_exposed_filter_remove_validation'] ]; } diff --git a/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php b/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php index 4be699a..1a048d9 100644 --- a/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php +++ b/modules/facets_exposed_filters/src/Plugin/views/filter/FacetsFilter.php @@ -126,6 +126,7 @@ class FacetsFilter extends FilterPluginBase { } $is_processing = TRUE; + $form_state->set('uses_facets_exposed_filters', TRUE); $form['value'] = $this->facetsViewsGetFacets(); $is_processing = FALSE; }