public function unserialize($facetsAsString) { $urlFragmentSerializer = new URLFragmentSerializer(); $facetsAsArray = $urlFragmentSerializer->unserialize($facetsAsString); $facets = []; foreach ($facetsAsArray as $label => $filters) { $facet = new Facet(); $facet->setLabel($label); foreach ($filters as $filterLabel) { $filter = new Filter(); $filter->setLabel($filterLabel)->setActive(true); $facet->addFilter($filter); } $facets[] = $facet; } return $facets; }
public function setFiltersFromEncodedFacets(array $facets, $encodedFacets) { $urlSerializer = new URLFragmentSerializer(); $facetAndFiltersLabels = $urlSerializer->unserialize($encodedFacets); foreach ($facetAndFiltersLabels as $facetLabel => $filters) { foreach ($facets as $facet) { if ($facet->getLabel() === $facetLabel) { if (true === $facet->getProperty('range')) { $symbol = $filters[0]; $from = $filters[1]; $to = $filters[2]; $found = false; foreach ($facet->getFilters() as $filter) { if ($from >= $filter->getValue()['from'] && $to <= $filter->getValue()['to']) { $filter->setActive(true); $found = true; } } if (!$found) { $filter = new Filter(); $filter->setValue(['from' => $from, 'to' => $to])->setProperty('symbol', $symbol); $filter->setActive(true); $facet->addFilter($filter); } } else { foreach ($filters as $filterLabel) { foreach ($facet->getFilters() as $filter) { if ($filter->getLabel() === $filterLabel) { $filter->setActive(true); } } } } } } } return $facets; }
/** * This method generates a URL stub for each filter inside the given facets * and assigns this stub to the filters. * The URL stub is called 'nextEncodedFacets' because it is used * to generate the URL of the search once a filter is activated. */ private function addEncodedFacetsToFilters(array $facets) { // first get the currently active facetFilter in an array $activeFacetFilters = $this->facetsSerializer->getActiveFacetFiltersFromFacets($facets); $urlSerializer = new URLFragmentSerializer(); foreach ($facets as $facet) { // If only one filter can be selected, we keep track of // the current active filter to disable it before generating the url stub // and not select two filters in a facet that can have only one active filter. if (!$facet->isMultipleSelectionAllowed()) { foreach ($facet->getFilters() as $filter) { if ($filter->isActive()) { // we have a currently active filter is the facet, remove it from the facetFilter array $activeFacetFilters = $this->facetsSerializer->removeFilterFromFacetFilters($activeFacetFilters, $filter, $facet); break; } } } foreach ($facet->getFilters() as $filter) { $facetFilters = $activeFacetFilters; // toggle the current filter if ($filter->isActive()) { $facetFilters = $this->facetsSerializer->removeFilterFromFacetFilters($facetFilters, $filter, $facet); } else { $facetFilters = $this->facetsSerializer->addFilterToFacetFilters($facetFilters, $filter, $facet); } // We've toggled the filter, so the call to serialize // returns the "URL" for the search when user has toggled // the filter. $filter->setNextEncodedFacets($urlSerializer->serialize($facetFilters)); } } }