/** * Adds filters specified through HTTP GET as filter query parameters to * the Solr query. * */ protected function addFacetQueryFilters() { // todo refactor to use a request object $resultParameters = GeneralUtility::_GET('tx_solr'); // format for filter URL parameter: // tx_solr[filter]=$facetName0:$facetValue0,$facetName1:$facetValue1,$facetName2:$facetValue2 if (is_array($resultParameters['filter'])) { $filters = array_map('urldecode', $resultParameters['filter']); // $filters look like array('name:value1','name:value2','fieldname2:foo') $configuredFacets = $this->getConfiguredFacets(); // first group the filters by facetName - so that we can // decide later whether we need to do AND or OR for multiple // filters for a certain facet/field // $filtersByFacetName look like array('name' => array ('value1', 'value2'), 'fieldname2' => array('foo')) $filtersByFacetName = array(); foreach ($filters as $filter) { // only split by the first colon to allow using colons in the filter value itself list($filterFacetName, $filterValue) = explode(':', $filter, 2); if (in_array($filterFacetName, $configuredFacets)) { $filtersByFacetName[$filterFacetName][] = $filterValue; } } foreach ($filtersByFacetName as $facetName => $filterValues) { $facetConfiguration = $this->allConfiguredFacets[$facetName . '.']; $filterEncoder = $this->facetRendererFactory->getFacetFilterEncoderByFacetName($facetName); $tag = ''; if ($facetConfiguration['keepAllOptionsOnSelection'] == 1 || $this->configuration->getSearchFacetingKeepAllFacetsOnSelection()) { $tag = '{!tag=' . addslashes($facetConfiguration['field']) . '}'; } $filterParts = array(); foreach ($filterValues as $filterValue) { if (!is_null($filterEncoder)) { $filterOptions = $facetConfiguration[$facetConfiguration['type'] . '.']; if (empty($filterOptions)) { $filterOptions = array(); } $filterValue = $filterEncoder->decodeFilter($filterValue, $filterOptions); $filterParts[] = $facetConfiguration['field'] . ':' . $filterValue; } else { $filterParts[] = $facetConfiguration['field'] . ':"' . addslashes($filterValue) . '"'; } } $operator = $facetConfiguration['operator'] == 'OR' ? ' OR ' : ' AND '; $this->facetFilters[] = $tag . '(' . implode($operator, $filterParts) . ')'; } } }