Commit e5a0efa0 authored by Markus Kalkbrenner's avatar Markus Kalkbrenner Committed by Markus Kalkbrenner
Browse files

Issue #2908937 by Anybody, Grimreaper, mkalkbrenner, idebr, jefuri,...

Issue #2908937 by Anybody, Grimreaper, mkalkbrenner, idebr, jefuri, johnjw59@gmail.com, borisson_, dragos-dumi, andy_w, helioha, zorz, basvredeling, dealancer: Dependend Facets don't reset after Conditions are not met anymore
parent c3110f5b
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -110,7 +110,43 @@ class DefaultFacetManager {
   */
  public function alterQuery(&$query, $facetsource_id) {
    /** @var \Drupal\facets\FacetInterface[] $facets */
    foreach ($this->getFacetsByFacetSourceId($facetsource_id) as $facet) {
    $facets = $this->getFacetsByFacetSourceId($facetsource_id);
    foreach ($facets as $facet) {

      $processors = $facet->getProcessors();
      if (isset($processors['dependent_processor'])) {
        $conditions = $processors['dependent_processor']->getConfiguration();

        $enabled_conditions = [];
        foreach ($conditions as $facet_id => $condition) {
          if (empty($condition['enable'])) {
            continue;
          }
          $enabled_conditions[$facet_id] = $condition;
        }

        foreach ($enabled_conditions as $facet_id => $condition_settings) {

          if (!isset($facets[$facet_id]) || !$processors['dependent_processor']->isConditionMet($condition_settings, $facets[$facet_id])) {
            // The conditions are not met anymore, remove the active items.
            $facet->setActiveItems([]);

            // Remove the query parameter from other facets.
            foreach ($facets as $other_facet) {
              /** @var \Drupal\facets\UrlProcessor\UrlProcessorInterface $urlProcessor */
              $urlProcessor = $other_facet->getProcessors()['url_processor_handler']->getProcessor();
              $active_filters = $urlProcessor->getActiveFilters();
              unset($active_filters[$facet->id()]);
              $urlProcessor->setActiveFilters($active_filters);
            }

            // Don't convert this facet's active items into query conditions.
            // Continue with the next facet.
            continue(2);
          }
        }
      }

      /** @var \Drupal\facets\QueryType\QueryTypeInterface $query_type_plugin */
      $query_type_plugin = $this->queryTypePluginManager->createInstance(
        $facet->getQueryType(),
@@ -148,7 +184,7 @@ class DefaultFacetManager {
    $facets = [];
    foreach ($this->facets as $facet) {
      if ($facet->getFacetSourceId() === $facetsource_id) {
        $facets[] = $facet;
        $facets[$facet->id()] = $facet;
      }
    }
    return $facets;
+35 −19
Original line number Diff line number Diff line
@@ -167,28 +167,45 @@ class DependentFacetProcessor extends ProcessorPluginBase implements BuildProces
      return $results;
    }

    $return = TRUE;

    foreach ($enabled_conditions as $facet_id => $condition_settings) {

      /** @var \Drupal\facets\Entity\Facet $current_facet */
      $current_facet = $this->facetStorage->load($facet_id);
      $current_facet = $this->facetsManager->returnBuiltFacet($current_facet);

      if ($condition_settings['condition'] == 'not_empty') {
        $return = !empty($current_facet->getActiveItems());
      if (!$this->isConditionMet($condition_settings, $current_facet)) {
        return [];
      }
    }

    return $results;
  }

      if ($condition_settings['condition'] == 'values') {
  /**
   * Check if the condition for a given facet is met.
   *
   * @param array $condition_settings
   *   The condition settings for the facet to check.
   * @param \Drupal\facets\FacetInterface $facet
   *   Tne facet to check.
   *
   * @return bool
   */
  public function isConditionMet(array $condition_settings, FacetInterface $facet) {
    $return = TRUE;

    if ($condition_settings['condition'] === 'not_empty') {
      $return = !empty($facet->getActiveItems());
    }

    if ($condition_settings['condition'] === 'values') {
      $return = FALSE;

      $values = explode(',', $condition_settings['values']);
        foreach ($current_facet->getResults() as $result) {
          $isActive = $result->isActive();
          $raw_value_in_expected = in_array($result->getRawValue(), $values);
          $display_value_in_expected = in_array($result->getDisplayValue(), $values);
          if ($isActive && ($raw_value_in_expected || $display_value_in_expected)) {
      foreach ($facet->getActiveItems() as $value) {
        if (in_array($value, $values)) {
          $return = TRUE;
          break;
        }
      }
    }
@@ -196,9 +213,8 @@ class DependentFacetProcessor extends ProcessorPluginBase implements BuildProces
    if (!empty($condition_settings['negate'])) {
      $return = !$return;
    }
    }

    return $return ? $results : [];
    return $return;
  }

}
+24 −0
Original line number Diff line number Diff line
@@ -301,6 +301,30 @@ class IntegrationTest extends FacetsTestBase {
    $this->clickLink('item');
    $this->assertSession()->linkNotExists('grape');
    $this->assertSession()->linkNotExists('orange');

    // Disable negation again.
    $this->drupalGet('admin/config/search/facets/' . $depending_facet_id . '/edit');
    $edit = [
      'facet_settings[dependent_processor][status]' => TRUE,
      'facet_settings[dependent_processor][settings][' . $facet_id . '][enable]' => TRUE,
      'facet_settings[dependent_processor][settings][' . $facet_id . '][condition]' => 'values',
      'facet_settings[dependent_processor][settings][' . $facet_id . '][values]' => 'item',
      'facet_settings[dependent_processor][settings][' . $facet_id . '][negate]' => FALSE,
    ];
    $this->submitForm($edit, 'Save');

    $this->drupalGet('search-api-test-fulltext');
    $this->assertSession()->pageTextContains('Displaying 5 search results');
    $this->assertSession()->linkNotExists('grape');
    $this->clickLink('item');
    $this->assertSession()->pageTextContains('Displaying 3 search results');
    $this->assertSession()->linkExists('grape');
    $this->clickLink('grape');
    $this->assertSession()->pageTextContains('Displaying 1 search results');
    // Disable item again, and the grape should not be reflected in the search
    // result anymore.
    $this->clickLink('item');
    $this->assertSession()->pageTextContains('Displaying 5 search results');
  }

  /**
+4 −4
Original line number Diff line number Diff line
@@ -71,12 +71,12 @@ class DefaultFacetManagerTest extends KernelTestBase {
    $planetFacets = $dfm->getFacetsByFacetSourceId('planets');
    $this->assertNotEmpty($planetFacets);
    $this->assertCount(1, $planetFacets);
    $this->assertSame('Jupiter', $planetFacets[0]->id());
    $this->assertSame('Jupiter', $planetFacets['Jupiter']->id());

    $formerPlanetFacets = $dfm->getFacetsByFacetSourceId('former_planets');
    $this->assertNotEmpty($formerPlanetFacets);
    $this->assertCount(1, $formerPlanetFacets);
    $this->assertSame('Pluto', $formerPlanetFacets[0]->id());
    $this->assertSame('Pluto', $formerPlanetFacets['Pluto']->id());

    // Make pluto a planet again.
    $entity->setFacetSourceId('planets');
@@ -98,8 +98,8 @@ class DefaultFacetManagerTest extends KernelTestBase {
    $planetFacets = $dfm->getFacetsByFacetSourceId('planets');
    $this->assertNotEmpty($planetFacets);
    $this->assertCount(2, $planetFacets);
    $this->assertSame('Jupiter', $planetFacets[0]->id());
    $this->assertSame('Pluto', $planetFacets[1]->id());
    $this->assertSame('Jupiter', $planetFacets['Jupiter']->id());
    $this->assertSame('Pluto', $planetFacets['Pluto']->id());
  }

  /**