Ejemplo n.º 1
0
 /**
  * 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) . ')';
         }
     }
 }