getSearchFacetingFacetByName($facetName); $jsonFacetOptions = [ 'type' => 'terms', 'field' => $facetConfiguration['field'], ]; $jsonFacetOptions['limit'] = $this->buildLimitForJson($facetConfiguration, $configuration); $jsonFacetOptions['mincount'] = $this->buildMincountForJson($facetConfiguration, $configuration); $sorting = $this->buildSortingForJson($facetConfiguration); if (!empty($sorting)) { $jsonFacetOptions['sort'] = $sorting; } if (is_array($facetConfiguration['metrics.'])) { foreach ($facetConfiguration['metrics.'] as $key => $value) { $jsonFacetOptions['facet']['metrics_' . $key] = $value; } } $excludeTags = $this->buildExcludeTagsForJson($facetConfiguration, $configuration); if (!empty($excludeTags)) { $jsonFacetOptions['domain']['excludeTags'] = $excludeTags; } $facetParameters['json.facet'][$facetName] = $jsonFacetOptions; return $facetParameters; } /** * @param array $facetConfiguration * @param TypoScriptConfiguration $configuration * @return string */ protected function buildExcludeTagsForJson(array $facetConfiguration, TypoScriptConfiguration $configuration) { $excludeFields = []; if ($configuration->getSearchFacetingKeepAllFacetsOnSelection()) { if (!$configuration->getSearchFacetingCountAllFacetsForSelection()) { // keepAllOptionsOnSelection globally active foreach ($configuration->getSearchFacetingFacets() as $facet) { $excludeFields[] = $facet['field']; } } else { $excludeFields[] = $facetConfiguration['field']; } } $isKeepAllOptionsActiveForSingleFacet = $facetConfiguration['keepAllOptionsOnSelection'] == 1; if ($isKeepAllOptionsActiveForSingleFacet) { $excludeFields[] = $facetConfiguration['field']; } if (!empty($facetConfiguration['additionalExcludeTags'])) { $excludeFields[] = $facetConfiguration['additionalExcludeTags']; } return implode(',', array_unique($excludeFields)); } /** * @param array $facetConfiguration * @param TypoScriptConfiguration $configuration * @return int */ protected function buildLimitForJson(array $facetConfiguration, TypoScriptConfiguration $configuration) { if (isset($facetConfiguration['facetLimit'])) { return (int)$facetConfiguration['facetLimit']; } elseif (!is_null($configuration->getSearchFacetingFacetLimit()) && $configuration->getSearchFacetingFacetLimit() >= 0) { return $configuration->getSearchFacetingFacetLimit(); } else { return -1; } } /** * @param array $facetConfiguration * @param TypoScriptConfiguration $configuration * @return int */ protected function buildMincountForJson(array $facetConfiguration, TypoScriptConfiguration $configuration) { if (isset($facetConfiguration['minimumCount'])) { return (int)$facetConfiguration['minimumCount']; } elseif (!is_null($configuration->getSearchFacetingMinimumCount()) && (int)$configuration->getSearchFacetingMinimumCount() >= 0) { return $configuration->getSearchFacetingMinimumCount(); } else { return 1; } } /** * @param array $facetConfiguration * @return string */ protected function buildSortingForJson(array $facetConfiguration) { if (isset($facetConfiguration['sortBy'])) { $sortingExpression = new SortingExpression(); $sorting = $facetConfiguration['sortBy']; $direction = $facetConfiguration['sortDirection']; return $sortingExpression->getForJsonFacet($sorting, $direction); } return ''; } }