Loading src/FacetManager/DefaultFacetManager.php +38 −2 Original line number Diff line number Diff line Loading @@ -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(), Loading Loading @@ -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; Loading src/Plugin/facets/processor/DependentFacetProcessor.php +35 −19 Original line number Diff line number Diff line Loading @@ -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; } } } Loading @@ -196,9 +213,8 @@ class DependentFacetProcessor extends ProcessorPluginBase implements BuildProces if (!empty($condition_settings['negate'])) { $return = !$return; } } return $return ? $results : []; return $return; } } tests/src/Functional/IntegrationTest.php +24 −0 Original line number Diff line number Diff line Loading @@ -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'); } /** Loading tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php +4 −4 Original line number Diff line number Diff line Loading @@ -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'); Loading @@ -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()); } /** Loading Loading
src/FacetManager/DefaultFacetManager.php +38 −2 Original line number Diff line number Diff line Loading @@ -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(), Loading Loading @@ -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; Loading
src/Plugin/facets/processor/DependentFacetProcessor.php +35 −19 Original line number Diff line number Diff line Loading @@ -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; } } } Loading @@ -196,9 +213,8 @@ class DependentFacetProcessor extends ProcessorPluginBase implements BuildProces if (!empty($condition_settings['negate'])) { $return = !$return; } } return $return ? $results : []; return $return; } }
tests/src/Functional/IntegrationTest.php +24 −0 Original line number Diff line number Diff line Loading @@ -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'); } /** Loading
tests/src/Kernel/FacetManager/DefaultFacetManagerTest.php +4 −4 Original line number Diff line number Diff line Loading @@ -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'); Loading @@ -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()); } /** Loading